我面临的情况是,如果我在会话中存储表格,在进行了新的战争部署并试图访问表格后,我会得到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);
    }

但是不确定是否有更优雅的替代方法,因为我不喜欢捕获Runtime Exceptions,并且不想每次部署新战争时都重新启动服务器。

谢谢。

有帮助吗?

解决方案

您可以使用运算符实例

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. 创建一个 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 (意思是,使用文件存储系统代替数据库存储系统)。

希望这可以帮助。

一些应用程序服务器允许在重新部署之前清除会话。 树脂 例如,将继续使用旧会话的旧代码,将新会话移至新代码上。显然,您需要在某个时候过期用户会话。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top