Java 在GAE HRD中从Json创建的JDO在实例重新启动之前不会正确转换回Json
我正在开发一个Android应用程序,使用谷歌应用程序引擎来存储和管理应用程序的数据。不幸的是,我遇到了一个我似乎无法解决的问题 当用户创建一个新帐户时,会为他们创建一个新的“项目”。此项目包含任务,这些任务存储在项目类的ArrayList中。因此,在项目类的构造函数中,所有内容都是实例化的,任务是使用Gson2.2.2从一个文本文件中创建的,其中包含Json格式的数据Java 在GAE HRD中从Json创建的JDO在实例重新启动之前不会正确转换回Json,java,google-app-engine,gson,Java,Google App Engine,Gson,我正在开发一个Android应用程序,使用谷歌应用程序引擎来存储和管理应用程序的数据。不幸的是,我遇到了一个我似乎无法解决的问题 当用户创建一个新帐户时,会为他们创建一个新的“项目”。此项目包含任务,这些任务存储在项目类的ArrayList中。因此,在项目类的构造函数中,所有内容都是实例化的,任务是使用Gson2.2.2从一个文本文件中创建的,其中包含Json格式的数据 所有这些都很好,如果我查看appengine管理控制台中的数据存储查看器,一切看起来都很好。创建帐户后,用户立即登录,当用户登
所有这些都很好,如果我查看appengine管理控制台中的数据存储查看器,一切看起来都很好。创建帐户后,用户立即登录,当用户登录任务时,需要将任务发送到Android客户端。这就是它变得奇怪的地方。将任务序列化回Json格式时,它们似乎未初始化。所有字符串字段均为空,整数均设置为0,但正在序列化正确数量的任务,因此将填充列表。这个问题一直存在,直到我手动关闭GAE中的实例。当使用新请求重新启动时,数据将正确序列化为Json格式,一切正常。显然,这并不好,我不能让服务器在每次新用户创建帐户时关闭它的实例,只是为了能够为他们提供正确的数据。所以,请帮我解决这个问题。我已经挣扎了很长一段时间了。下面是准确再现问题的代码
public class CreateData extends HttpServlet{
public void doGet(HttpServletRequest req, HttpServletResponse resp){
if(req.getParameter("name").length() > 1){
PersistenceManager pm = PMF.get().getPersistenceManager();
User u = new User(req.getParameter("name"));
pm.makePersistent(u);
pm.close();
try {
resp.getWriter().print("User created with name "+req.getParameter("name"));
} catch (IOException e) {
e.printStackTrace();
}
}else if(req.getParameter("name").length() <= 1){
try {
resp.getWriter().print("Please supply a name with at least 2 characters");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}else{
try {
resp.sendError(400);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
用于获取数据的Servlet
public class GetData extends HttpServlet{
public void doGet(HttpServletRequest req, HttpServletResponse resp){
String name = req.getParameter("name");
PersistenceManager pm = PMF.get().getPersistenceManager();
User u = null;
try{
u = pm.getObjectById(User.class, name);
}catch(JDOObjectNotFoundException e){
try {
resp.sendError(404);
} catch (IOException e1) {
e1.printStackTrace();
}
}
if(u != null){
String response = u.getDatasAsJSON();
try {
resp.getWriter().print(response);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
还有JSON数据
[
{
"name": "Hug",
"unique": 1,
"points": 20
},
{
"name": "Tug",
"unique": 2,
"points": 40
},
{
"name": "Rug",
"unique": 3,
"points": 50
},
{
"name": "Jug",
"unique": 4,
"points": 100
},
{
"name": "Smug",
"unique": 5,
"points": 20
}
]
因此,创建一个名为“Arne”的新用户可以很好地工作,并且对象是在HDR中创建的。请求将对象作为Json从数据存储区返回会产生此响应
[{"points":0,"unique":0},{"points":0,"unique":0},{"points":0,"unique":0},{"points":0,"unique":0},{"points":0,"unique":0}]
重新启动服务器实例时,相同的请求会给出此响应
[{"name":"Hug","points":20,"unique":1},{"name":"Tug","points":40,"unique":2},{"name":"Rug","points":50,"unique":3},{"name":"Jug","points":100,"unique":4},{"name":"Smug","points":20,"unique":5}]
很抱歉发了这么长的帖子,但希望有人能向我指出我做错了什么。非常感谢!
顺致敬意,
Ivar糟糕的是,似乎没有人能回答这个问题,尽管我已经找到了解决办法。我仍然认为这需要一个合适的解决方案,但至少我现在已经通过循环所有对象并使用对象中某个字段的值指定一个临时变量使其工作。这似乎迫使它们进行初始化,返回的JSON实际上填充了正确的字段
public class GetData extends HttpServlet{
public void doGet(HttpServletRequest req, HttpServletResponse resp){
String name = req.getParameter("name");
PersistenceManager pm = PMF.get().getPersistenceManager();
User u = null;
try{
u = pm.getObjectById(User.class, name);
}catch(JDOObjectNotFoundException e){
try {
resp.sendError(404);
} catch (IOException e1) {
e1.printStackTrace();
}
}
if(u != null){
//By adding this seemingly pointless loop
//the objects will actually return populated fields
//when converted back to JSON
for(DataType dt : u.getData()){
String temp = dt.getName();
}
String response = u.getDatasAsJSON();
try {
resp.getWriter().print(response);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
[{"name":"Hug","points":20,"unique":1},{"name":"Tug","points":40,"unique":2},{"name":"Rug","points":50,"unique":3},{"name":"Jug","points":100,"unique":4},{"name":"Smug","points":20,"unique":5}]
public class GetData extends HttpServlet{
public void doGet(HttpServletRequest req, HttpServletResponse resp){
String name = req.getParameter("name");
PersistenceManager pm = PMF.get().getPersistenceManager();
User u = null;
try{
u = pm.getObjectById(User.class, name);
}catch(JDOObjectNotFoundException e){
try {
resp.sendError(404);
} catch (IOException e1) {
e1.printStackTrace();
}
}
if(u != null){
//By adding this seemingly pointless loop
//the objects will actually return populated fields
//when converted back to JSON
for(DataType dt : u.getData()){
String temp = dt.getName();
}
String response = u.getDatasAsJSON();
try {
resp.getWriter().print(response);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}