Fangen Classcast wenn Sie ein Objekt in der Sitzung speichern und versuchen, es nach einer neuen Bereitstellung zugreifen?
-
10-10-2019 - |
Frage
Ich bin eine Situation, wo, wenn ich ein Formular in der Sitzung gespeichert, nach einer neuen Bereitstellung eines Krieges zu machen und zu versuchen, das Formular zu gelangen, ich java.lang.ClassCastException erhalten.
Um dem Benutzer diese transparent zu machen, schrieb ich den folgenden Code:
try {
command = (ReservationOfBooksCommand) request.getPortletSession().getAttribute(RESERVATION_OF_BOOKS_COMMAND_SESSION_NAME);
} catch (ClassCastException e) {
request.getPortletSession().removeAttribute(RESERVATION_OF_BOOKS_COMMAND_SESSION_NAME);
}
Aber nicht sicher, ob es eine elegantere Alternative ist, wie ich es nicht tun, wie Runtime fangen und wollen nicht den Server jedes Mal neu zu starten ich einen neuen Krieg einzusetzen.
Danke.
Lösung
Sie können den instanceof-Operator
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{
...
}
Andere Tipps
Da Sie diese Frage mit tomcat
Tags versehen haben, schlage ich vor, dass Sie:
- Erstellen Sie eine
META-INF/context.xml
in Ihrer eigenen Web-Anwendung. - Fügen Sie die folgende Code-Zeile innerhalb des context.xml.
Beispiel:
<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>
Wie Michael Barker sagte, die meisten Anwendungsserver säubern Anfragen und Sitzungen nach einer Umschichtung in der Standardeinstellung.
Damit Tomcat, die Sitzung zu speichern, Satz saveOnRestart="true"
. Dies ermöglicht tomcat die Sitzung zu speichern PersistentManager
in einem FileStore
mit (dh, ein Dateispeichersystem anstelle eines Datenbank-Speicher-System).
Hope, das hilft.
Einige App-Server ermöglichen die Sitzungen vor Umschichtung abgebaut werden. Harz zum Beispiel wird auch weiterhin den alten Code verwenden, um die alte Sitzung, neue Sitzungen auf neuen Code zu bewegen. Natürlich müssen Sie die Benutzer-Sitzung zu einem bestimmten Zeitpunkt auslaufen.