会话数据不存在于GAE(Java)中

时间:2011-10-01 19:14:31

标签: google-app-engine session

我在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)。然而,会话被创建,因为我可以在后端看到它,还有一个类在会话中持久存在。

有人有建议吗?提前谢谢。

3 个答案:

答案 0 :(得分:4)

你的问题可能与以下任何一个有关:

  1. GAE经常几乎立即序列化会话,dev环境不会。因此,图表中的所有对象都必须实现Serializable。

  2. 但更可能的是,在修改会话变量之后,你必须执行类似req.getSession()。setAttribute(myKey,myObj)之类的操作 - 它不会在对象中看到更改并自动将其写回到会话...所以会话属性将具有他们上次设置时所拥有的值。

  3. 上面的问题#2花了我无数的时间和痛苦,直到我绊倒(通过漫长的消除过程)。

答案 1 :(得分:0)

答案 2 :(得分:0)

使类代理和联系Serializable解决了这个问题。这意味着会话属性中存在的每个对象(无论是嵌套还是其他对象)都应该是可序列化的。