我在基于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 ...
答案 0 :(得分:1)
在幕后,tapestry调用HttpSession.setAttribute(...)
并且就servlet规范而言,这不需要对象为Serializable
。
如果Servlet容器执行以下操作,则会要求会话对象为Serializable
默认情况下,Tomcat会保存/恢复到磁盘,而Jetty则不会。这就是你在Tomcat上看到问题而不是Jetty的原因。我确信如果您启用了Jetty备份到磁盘(通过HashSessionManager)或启用了群集,您将在Jetty上看到相同类型的异常。
因此,根据经验,您应始终确保会话属性为Serializable
。也许您应该配置Jetty的HashSessionManager以获得更一致的行为。