2

フォームをセッションに保存した場合、戦争の新しいデプロイメントを作成してフォームにアクセスしようとすると、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をキャッチするのが好きではなく、新しい戦争を展開するたびにサーバーを再起動したくないので、より洗練された代替手段があるかどうかはわかりません。

ありがとう。

4

3 に答える 3

3

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{
   ...
}
于 2010-12-08T19:37:42.480 に答える
1

この質問に のタグを付けたのでtomcat、次のことをお勧めします。

  1. 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 は を使用PersistentManagerしてセッションを保存できFileStoreます (つまり、データベース ストレージ システムの代わりにファイル ストレージ システムを使用します)。

お役に立てれば。

于 2010-12-08T19:42:39.773 に答える
0

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

于 2010-12-08T19:35:32.527 に答える