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.