Attraper ClassCastException lorsque vous stockez un objet en session et essayez d'y accéder après un nouveau déploiement?
-
10-10-2019 - |
Question
Je suis face à une situation où, si j'emmagasinés une forme en session, après avoir fait un nouveau déploiement d'une guerre et d'essayer d'accéder au formulaire, je reçois un java.lang.ClassCastException.
Afin de rendre cette transparente pour l'utilisateur, je l'ai écrit le code suivant:
try {
command = (ReservationOfBooksCommand) request.getPortletSession().getAttribute(RESERVATION_OF_BOOKS_COMMAND_SESSION_NAME);
} catch (ClassCastException e) {
request.getPortletSession().removeAttribute(RESERVATION_OF_BOOKS_COMMAND_SESSION_NAME);
}
Mais ne sais pas s'il y a une alternative plus élégante que je ne aime pas attraper RuntimeExceptions et ne veulent pas redémarrer le serveur chaque fois que je déploie une nouvelle guerre.
Merci.
La solution
Vous pouvez utiliser l'opérateur instanceof
Object command = request.getPortletSession().getAttribute(RESERVATION_OF_BOOKS_COMMAND_SESSION_NAME);
if(!(command instanceof ReservationOfBooksCommand)){
request.getPortletSession().removeAttribute(RESERVATION_OF_BOOKS_COMMAND_SESSION_NAME);
}else{
...
}
Autres conseils
Puisque vous avez balisé cette question avec tomcat
, je vous suggère:
- Créer un
META-INF/context.xml
dans votre propre application web. - Ajoutez la ligne de code suivant à l'intérieur du context.xml.
Exemple:
<context>
<!-- stuff here-->
<!-- Persistence Manager. This handles all of session Tomcat handles from our app. -->
<Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="false">
<Store className="org.apache.catalina.session.FileStore" />
</Manager>
</context>
Comme Michael Barker a dit, la plupart des serveurs d'applications et des sessions demandes Cleans après un redéploiement, par défaut.
Pour permettre Tomcat de stocker la session, ensemble saveOnRestart="true"
. Cela permet de stocker tomcat la session en utilisant PersistentManager
dans un FileStore
(ce qui signifie, utilisez un système de stockage de fichiers au lieu d'un système de stockage de base de données).
Hope this helps.
Certains serveurs d'applications permettent aux sessions à effacer avant de redéployer. résine par exemple continuera d'utiliser l'ancien code l'ancienne session, se déplaçant de nouvelles sessions sur le nouveau code. Évidemment, vous devrez expirer la session de l'utilisateur à un moment donné.