【问题标题】:Tapestry @Persist(PersistenceConstants.FLASH) issues with Tomcat but not JettyTapestry @Persist(PersistenceConstants.FLASH) 问题与 Tomcat 但不是 Jetty
【发布时间】:2014-07-18 14:51:40
【问题描述】:

我在部署基于 Tapestry 5.4(AppFuse 模块化之一)的应用程序时遇到了问题。希望我解决了它,但我仍然想知道为什么....

Tapestry 提供了一种简单 机制来将变量从一个页面存储到另一个页面,序列化对象:

package com.corp.div.project.admin;

public class EmployeList {
    /* ... */
    @Persist(PersistenceConstants.FLASH)
    ComplexObject myObject;
}

在使用 jetty(使用 mvn :etty:run)时,对象已正确通过请求,但在使用 Tomcat(6 使用 maven 插件,或 7 全新安装)时出现异常:

    Error persisting field admin/EmployeList:myObject: setAttribute: Non-serializable attribute flash:admin/EmployeList::myObject

显然,我在课堂上添加了implements Serialzable

public class ComplexObject implements Serializable {

/**
 * UID
 */
private static final long serialVersionUID = -76621654341617565L;

但我仍然想知道为什么它适用于码头而不适用于 Tomcat...

【问题讨论】:

    标签: java jetty tomcat7 tapestry


    【解决方案1】:

    在后台,tapestry 调用 HttpSession.setAttribute(...),就 servlet 规范而言,这并不要求对象是 Serializable

    Servlet 容器将要求会话对象为 Serializable,如果它们执行以下操作

    • 在关机/启动时从磁盘保存/恢复会话
    • HTTPSession 集群

    默认情况下,Tomcat 会保存/恢复到磁盘,而 Jetty 不会。这就是为什么您在 Tomcat 上看到问题,但在 Jetty 上没有看到问题。我敢肯定,如果您启用了 Jetty 的磁盘备份(通过HashSessionManager)或启用了集群,您会在 Jetty 上看到相同类型的异常。

    因此,根据经验,您应始终确保会话属性为Serializable。也许您应该配置 Jetty 的 HashSessionManager 以获得更一致的行为。

    【讨论】:

    • 谢谢@Lance。听起来就像我那些日子里的红。确实,我发现很多关于Tomcat关闭保存的问题都与这个错误有关,你的解释很清楚。非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多