Daniel,

To "convert" old session data I started to persist just the user Id in 
session. Sadly, unlike memcache, you can't control how the session is 
deserialized. In my case, any request with has the old user data in session 
was throwing 500 erros and I couldn't control this behavior (it was a 
filter from the gae...). What I did was something like this:

public MyUser getCurrentUser(HttpServletRequest req) {
   Object userOrId = req.getSession().getAttribute("user");
   if (userOrId instanceof Long) {
      return loadUserFromDsOrMemcache((Long) userOrId);
   } else {
      // Remove user from session and start storing ID for next change to 
User class dont raise exceptoins ... 
      User user = (User) userOrId;
      req.getSession().setAttribute("user", user.getId());
      return user;
   }
}

This way I could get rid of storing this in session and of the app being 
unacessible when I changed my model (wich was happening heavly by the 
way...). Note that at the time I deployed this code, the User object hasn't 
changed.

After running this for a while (you can expire sessions or delete them in 
bulk from the datastore so you can force them to expire, I deployed the new 
version.

To store json data, you may use some json library that can map/convert 
to/from Java -> Json, like Google Gson:

String userJson = new Gson().toJson(user);
req.getSession().setAttribute("user", userJson);
(...)

String userJson = (String) req.getSession().getAttribute("user");
if (userJson != null) {
   User user = new Gson().fromJson(User.class, userJson);
}

This way you can add/remove fields to you model, and old session data will 
be restored as expected. Note that is a good practice to set defaults for 
the new fields, so your session data won't create unusable objects. In your 
original post, the change from string to integer may be solved by 
overriding the Gson de-serializer to handle the id field as number and not 
as string. I guess that you can change the way Java will de-serialize your 
classes too, but I'm not sure if this will solve your particular issue 
mentioned.

Not sure if this is the best way to handle, but this is how I solved on our 
live app.

More on Gson: http://code.google.com/p/google-gson/.

Hope this helps (sorry for some typos or misspelled words)

Best Regards,

-Ronoaldo

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine for Java" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/google-appengine-java/-/kReedxuxpgEJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en.

Reply via email to