假设在Java Google App Engine(GAE / J)中,我使用com.google.appengine.api.users.UserService来获取当前用户的User对象。
我想将有关此用户的信息发送给客户;但是因为我正在使用Google Web Toolkit(GWT),所以我需要一个可以序列化的对象,而User不是其中之一,因为它属于服务器包。
因此,我在我的GWT共享目录中创建了一个名为UserStuff的新类,我将User的字段复制到UserStuff的实例中并将其发送给客户端。
稍后客户端将UserStuff对象发送回给我,我想将用户作为实体的属性附加。制作我能找到的User对象的唯一方法就是自己调用User的构造函数;也就是说,UserService API中的任何内容都不会为我提供一个完整形成的User对象,例如,用户ID(来自User.getUserId())https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/users/UserService
所以我使用User的构造函数创建一个User对象。这些构造函数都不允许我在User上设置昵称字段,也没有方法可以这样做! https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/users/User
现在,我可以让客户端发回一个令牌,说“获取当前用户并使用它”,但这很笨拙。此外,如果我有多个用户连接到它们的实体并且我想将它们发送到客户端并让客户端向我发回更多对象以放入数据存储区中,这应该让其他用户连接到实体,这就更成问题了。
一种方法是为每个用户创建一个UserStuff实体,当我将User作为当前用户时,将User作为该用户的UserStuff对象上的字段以及用户的!user-id提交。然后,当我想要User对象的user-id时,我可以获取该user-id的UserStuff对象,然后将用户的User对象作为UserStuff对象的属性。或者我可以将昵称放在UserStuff对象上。然而,这是很多额外的数据存储流量,因为我无法在User对象上设置昵称。
答案 0 :(得分:3)
除非您将原始用户对象存储在数据存储区中,否则无法获取给定ID的用户对象。同样,也无法更改用户的昵称。
User对象仅用于封装有关登录用户的基本信息;如果您需要额外的信息或行为(例如用户设置的昵称),您应该创建自己的UserInfo模型,并使用它。您可以将其键名设置为用户对象的用户ID,这样您就可以通过简单的get操作找到登录用户的UserInfo。