将对象存储在会话中并在新部署后尝试访问该对象时,请捕获ClackCastException?
-
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);
}
但是不确定是否有更优雅的替代方法,因为我不喜欢捕获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
, ,我建议你:
- 创建一个
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