我在GAE中处理会话时遇到了困难。我试图在会话中存储两个类和一个字符串。尽管在DEV环境中运行良好,但在生产时,类和字符串不会在会话中持久存在。未保存为会话属性的类如下:
@PersistenceCapable(detachable="true")
public class Agent implements Serializable{
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;
@Persistent private String name; //Name of the Agency
@Element(dependent = "true")
private List<Contact> contacts = new ArrayList<Contact>();
@Element(dependent = "true")
private List<Agency> agencies = new ArrayList<Agency>();
@Persistent private List<Long> subAgents = new ArrayList<Long>();
@Persistent private Date createdOn = new Date();
}
我想再次提到它在DEV环境中工作正常,但在生产时我得到的值为null。正如您所看到的,我已经使类实现了Serializable。但我认为这不是问题,因为我将一个属性设置为一个简单的字符串,并且也失败了(我将属性值设置为null)。然而,会话被创建,因为我可以在后端看到它,还有一个类在会话中持久存在。
有人有建议吗?提前谢谢。
答案 0 :(得分:4)
你的问题可能与以下任何一个有关:
GAE经常几乎立即序列化会话,dev环境不会。因此,图表中的所有对象都必须实现Serializable。
但更可能的是,在修改会话变量之后,你必须执行类似req.getSession()。setAttribute(myKey,myObj)之类的操作 - 它不会在对象中看到更改并自动将其写回到会话...所以会话属性将具有他们上次设置时所拥有的值。
上面的问题#2花了我无数的时间和痛苦,直到我绊倒(通过漫长的消除过程)。
答案 1 :(得分:0)
您是否在配置文件中启用了会话? http://code.google.com/intl/en/appengine/docs/java/config/appconfig.html#Enabling_Sessions
答案 2 :(得分:0)
使类代理和联系Serializable解决了这个问题。这意味着会话属性中存在的每个对象(无论是嵌套还是其他对象)都应该是可序列化的。