ClassCastExceptionをキャッチして、セッションにオブジェクトを保存し、新しい展開後にアクセスしようとしますか?
-
10-10-2019 - |
質問
私は、セッションにフォームを保存し、戦争の新しい展開を行ってフォームにアクセスしようとした後、java.lang.classcastexceptionを取得した状況に直面しています。
これをユーザーに透明にするために、次のコードを書きました。
try {
command = (ReservationOfBooksCommand) request.getPortletSession().getAttribute(RESERVATION_OF_BOOKS_COMMAND_SESSION_NAME);
} catch (ClassCastException e) {
request.getPortletSession().removeAttribute(RESERVATION_OF_BOOKS_COMMAND_SESSION_NAME);
}
しかし、runtimeexceptionsをキャッチするのが嫌いで、新しい戦争を展開するたびにサーバーを再起動したくないので、よりエレガントな代替品があるかどうかはわかりません。
ありがとう。
解決
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{
...
}
他のヒント
この質問にタグを付けたので tomcat
, 、私はあなたを提案します:
- aを作成します
META-INF/context.xml
独自のWebアプリケーションで。 - Context.xml内に次のコード行を追加します。
サンプル:
<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>
Michael Barkerが言ったように、ほとんどのアプリケーションサーバーは、デフォルトで再配置後にリクエストとセッションをクリーンアップします。
Tomcatがセッションを保存できるようにするには、セットします saveOnRestart="true"
. 。これにより、Tomcatはセッションを使用して保存できます PersistentManager
で FileStore
(つまり、データベースストレージシステムの代わりにファイルストレージシステムを使用します)。
お役に立てれば。
一部のアプリサーバーにより、再展開する前にセッションをクリアすることができます。 樹脂 たとえば、古いセッションに古いコードを引き続き使用し、新しいセッションを新しいコードに移動します。明らかに、ある時点でユーザーセッションを期限切れにする必要があります。
所属していません StackOverflow