当您在会话中存储对象并在新部署后尝试访问它时,捕获 ClassCastException 吗?

发布于 2024-10-06 16:21:37 字数 495 浏览 7 评论 0原文

我面临的情况是,如果我在会话中存储表单,在进行新的战争部署并尝试访问该表单后,我会收到 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 并且不想每次部署新战争时都重新启动服务器。

谢谢。

I'm facing a situation where if I stored a form in session, after making a new deployment of a war and trying to access the form, I get a java.lang.ClassCastException.

In order to make this transparent to the user, I wrote the following code:

try {
        command = (ReservationOfBooksCommand) request.getPortletSession().getAttribute(RESERVATION_OF_BOOKS_COMMAND_SESSION_NAME);
    } catch (ClassCastException e) {
        request.getPortletSession().removeAttribute(RESERVATION_OF_BOOKS_COMMAND_SESSION_NAME);
    }

But not sure if there is a more elegant alternative as I don't like catching RuntimeExceptions and don't want to restart the server every time I deploy a new war.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

七婞 2024-10-13 16:21:37

您可以使用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{
   ...
}

You can use the instanceof operator

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{
   ...
}
吃兔兔 2024-10-13 16:21:37

由于您已使用 tomcat 标记了此问题,因此我建议您:

  1. 在您自己的 Web 应用程序中创建一个 META-INF/context.xml
  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 中(也就是说,使用文件存储系统而不是数据库存储系统)。

希望这有帮助。

Since you've tagged this question with tomcat, I suggest that you:

  1. Create a META-INF/context.xml in your own web application.
  2. Add the following code line inside the context.xml.

Sample:

<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>

As Michael Barker said, most application servers cleans requests and sessions after a redeployment, by default.

To allow Tomcat to store the session, set saveOnRestart="true". This allows tomcat to store the session using PersistentManager in a FileStore (meaning, use a file storage system instead of a database storage system).

Hope this helps.

奶气 2024-10-13 16:21:37

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

Some app servers allow the sessions to be cleared down before redeploying. Resin for example will continue to use the old code for the old session, moving new sessions onto new code. Obviously you will need to expire the users session at some point.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文