La captura de ClassCastException cuando vaya a guardar un objeto en la sesión e intenta acceder a él después de un nuevo despliegue?

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

Pregunta

estoy frente a una situación en la que si Almacené una forma en la sesión, después de hacer un nuevo despliegue de una guerra y tratando de acceder al formulario, aparece un java.lang.ClassCastException.

Con el fin de hacer que este transparente para el usuario, escribí el siguiente código:

try {
        command = (ReservationOfBooksCommand) request.getPortletSession().getAttribute(RESERVATION_OF_BOOKS_COMMAND_SESSION_NAME);
    } catch (ClassCastException e) {
        request.getPortletSession().removeAttribute(RESERVATION_OF_BOOKS_COMMAND_SESSION_NAME);
    }

Pero no estoy seguro si hay una alternativa más elegante como no me gusta la captura de RuntimeExceptions y no quiero que reiniciar el servidor cada vez que puedo implementar una nueva guerra.

Gracias.

¿Fue útil?

Solución

Se puede utilizar el operador 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{
   ...
}

Otros consejos

Desde que haya etiquetado a esta pregunta con tomcat, le sugiero que:

  1. Crea un META-INF/context.xml en su propia aplicación web.
  2. Añadir la siguiente línea de código dentro de la context.xml.

Muestra:

<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>

Como Michael Barker dijo, la mayoría de los servidores de aplicaciones Limpia solicitudes y sesiones después de una redistribución, por defecto.

Para permitir Tomcat para almacenar la sesión, saveOnRestart="true" conjunto. Esto permite que Tomcat para almacenar la sesión utilizando PersistentManager en un FileStore (es decir, utilizar un sistema de almacenamiento de archivos en lugar de un sistema de almacenamiento de base de datos).

Espero que esto ayude.

Algunos servidores de aplicaciones permiten a las sesiones que se borren abajo antes de volver a desplegar. Resina por ejemplo, seguirá utilizando el código antiguo para la sesión anterior, moviéndose hacia nuevas sesiones nuevo código. Obviamente tendrá que expira la sesión de usuarios en algún momento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top