2010-12-08 32 views
2

Je suis confronté à une situation où si je stockais un formulaire en session, après avoir fait un nouveau déploiement d'une guerre et en essayant d'accéder au formulaire, j'obtiens une java.lang.ClassCastException.Attraper ClassCastException lorsque vous stockez un objet dans une session et essayez d'y accéder après un nouveau déploiement?

Afin de rendre cette transparente pour l'utilisateur, j'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 pas sûr s'il y a une alternative plus élégante que je n'aime pas attraper RuntimeExceptions et ne veulent pas redémarrer le serveur chaque fois que je déploie une nouvelle guerre.

Merci.

Répondre

3

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{ 
    ... 
} 
+0

Je ne sais pas si la meilleure solution, mais au moins je la vois plus élégante que la mienne. Voyons voir si d'autres alternatives se présentent :) –

0

Certains serveurs d'applications permettent d'effacer les sessions avant de les redéployer. Par exemple, Resin continuera à utiliser l'ancien code pour l'ancienne session, en déplaçant de nouvelles sessions sur un nouveau code. Évidemment, vous devrez expirer la session des utilisateurs à un moment donné.

1

Puisque vous avez balisé cette question avec tomcat, je vous suggère:

  1. Créer une META-INF/context.xml dans votre propre application web.
  2. Ajoutez la ligne de code suivante dans le fichier 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 nettoie après un redéploiement, par défaut.

Pour permettre à Tomcat de stocker la session, définissez saveOnRestart="true". Ceci permet à tomcat de stocker la session en utilisant PersistentManager dans un FileStore (ce qui signifie, utiliser un système de stockage de fichiers au lieu d'un système de stockage de base de données).

Espérons que cela aide.

+0

Salut @The Elite Gentleman, le point que je voulais faire est que je ne veux pas un nouveau redémarrage à chaque redéploiement, même si je pouvais garder la session parmi les redémarrages. –

+0

@Juan Carlos Blanco Martínez, Malheureusement, je ne suis pas au courant de redéployer sans redémarrage car vos objets doivent être enregistrés dans le classloader du serveur d'applications. –

+0

Ok, j'utilise Liferay qui a une fonctionnalité de déploiement à chaud pour les plugins (comme les portlets, les thèmes ...), donc ma situation implique le redéploiement d'un plugin de portlets –