Facendo ClassCastException quando si memorizzano un oggetto in sessione e tenta di accedere dopo una nuova distribuzione?

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

Domanda

Sono di fronte a una situazione in cui, se ho conservato una forma in sessione, dopo aver effettuato una nuova distribuzione di una guerra e cercando di accedere al modulo, ho un java.lang.ClassCastException.

Al fine di rendere questo trasparente per l'utente, ho scritto il seguente codice:

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

Ma non è sicuro se c'è un più elegante alternativa come non mi piace la cattura RuntimeExceptions e non voglio riavviare il server ogni volta che distribuire una nuova guerra.

Grazie.

È stato utile?

Soluzione

È possibile utilizzare l'operatore 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{
   ...
}

Altri suggerimenti

Dal momento che hai codificato a questa domanda con tomcat, vi suggerisco di:

  1. Crea una META-INF/context.xml nella propria applicazione web.
  2. Aggiungi la seguente riga di codice all'interno del context.xml.

Esempio:

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

Come Michael Barker, ha detto, la maggior parte dei server delle applicazioni Pulisce le richieste e le sessioni dopo una ridistribuzione, per impostazione predefinita.

Per consentire Tomcat per memorizzare la sessione, insieme saveOnRestart="true". Questo consente a Tomcat di memorizzare la sessione utilizzando PersistentManager in un FileStore (che significa, utilizzare un sistema di archiviazione di file invece di un sistema di archiviazione di database).

Spero che questo aiuti.

Alcuni server app permettono alle sessioni per essere liquidati giù prima ridistribuzione. resina ad esempio continuerà ad utilizzare il vecchio codice per la vecchia seduta, spostando le nuove sessioni sul nuovo codice. Ovviamente è necessario per scadere la sessione di utenti ad un certo punto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top