ClassCastExceptionをキャッチして、セッションにオブジェクトを保存し、新しい展開後にアクセスしようとしますか?

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

質問

私は、セッションにフォームを保存し、戦争の新しい展開を行ってフォームにアクセスしようとした後、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, 、私はあなたを提案します:

  1. aを作成します META-INF/context.xml 独自のWebアプリケーションで。
  2. 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はセッションを使用して保存できます PersistentManagerFileStore (つまり、データベースストレージシステムの代わりにファイルストレージシステムを使用します)。

お役に立てれば。

一部のアプリサーバーにより、再展開する前にセッションをクリアすることができます。 樹脂 たとえば、古いセッションに古いコードを引き続き使用し、新しいセッションを新しいコードに移動します。明らかに、ある時点でユーザーセッションを期限切れにする必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top