Attraper ClassCastException lorsque vous stockez un objet en session et essayez d'y accéder après un nouveau déploiement?

StackOverflow https://stackoverflow.com/questions/4391462

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.

Était-ce utile?

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:

  1. Créer un META-INF/context.xml dans votre propre application web.
  2. 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é.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top