Tapestry @Persist(PersistenceConstants.FLASH)与Tomcat但不是Jetty有关

时间:2014-07-18 14:51:41

标签: java jetty tomcat7 tapestry

我在基于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 ...

1 个答案:

答案 0 :(得分:1)

在幕后,tapestry调用HttpSession.setAttribute(...)并且就servlet规范而言,这不需要对象为Serializable

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

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

默认情况下,Tomcat会保存/恢复到磁盘,而Jetty则不会。这就是你在Tomcat上看到问题而不是Jetty的原因。我确信如果您启用了Jetty备份到磁盘(通过HashSessionManager)或启用了群集,您将在Jetty上看到相同类型的异常。

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