【发布时间】:2012-07-14 16:57:12
【问题描述】:
我已经实现了一个系统来保存有关用户的信息。 所以我在我的课堂上有聚合,所以用户类有来自联系人类的列表......等等 在第一页“测试它只是为了通过电话号码注册用户”必须将用户保存在数据库中但是当我在 Google 应用程序引擎中部署我的项目时这会导致错误 500 服务器错误 >
另一个页面用于更新之前已经注册的现有用户,所以这里将添加到用户对象拥有的列表中。
用户类
@PersistenceCapable
public class User implements Serializable{
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
public String userNumber;
@Persistent (mappedBy = "userC")
public List<Contact> UserContacts =new ArrayList<Contact>();
public void AddContact(String name,String number) {
Contact C=new Contact();
C.ContactName=name;
C.PhoneNumber=number;
this.UserContacts.add(C); }
}
联系班级
@PersistenceCapable
public class Contact implements Serializable{
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Key key;
@Persistent
public String ContactName;
@Persistent
public String PhoneNumber;
@Persistent
public User userC; }
此页面导致用户测试注册将获得用户电话号码,注册应使用此号码创建新用户 测试页面
@SuppressWarnings("serial")
公共类测试扩展 HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/html");
resp.getWriter().println("<html><body><form method = \"POST\" action=\"/signup\">" + "please enter ur number :"+"<h4><label>name : <input name = \"userphoneNUMBER\" type = \"text \" size = \"25 \" /> </label>"+"<p> <input type = \"submit\" value = \"Submit\" />"+ "</form></body></html>");
}
}
本页取号创建用户
@SuppressWarnings("serial")
public class SignUP extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/plain");
String user_PhoneNumber=req.getParameter("userphoneNUMBER");
User obj = new User();
obj.userNumber=user_PhoneNumber;
resp.getWriter().println(obj.userNumber );
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
pm.makePersistent(obj);
} finally {
pm.close();
} } }
此页面继续更新已经存在的用户对象的值
@SuppressWarnings("serial")
public class Testinfo extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/html");
resp.getWriter().println("<html><body><form method = \"POST\" action=\"/saveinfo\">" +
"<center> <h2>please fill this form :</h2> </br> "+
"<h4><label> ContactName : <input name = \"ContactName\" type = \"text \" size = \"25 \" /> </label>"
+
"<p> <input type = \"submit\" value = \"Submit\" />"+
"</form></body></html>");
}
}
此页面用于保存导致错误的信息,并且不会在应用引擎中保存任何值
@SuppressWarnings("serial")
public class SaveInfo extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/plain");
String ContactName = req.getParameter("ContactName");
String ContactNumber = req.getParameter("ContactNumber");
PersistenceManager pm = PMF.get().getPersistenceManager();
Query query = pm.newQuery("select from " + User.class.getName());
List<User> list = (List<User>) query.execute();
for (User obj : list) {
if (obj.userNumber.equals("111")) {
pm.currentTransaction().begin();
obj.AddContact(ContactName, ContactNumber);
pm.makePersistent(obj);
pm.currentTransaction().commit(); }
}
pm.close(); } }
这个 111 用于测试,我之前输入的用户电话号码。
那么我该如何处理列表和聚合问题?
更新用户信息时出现此错误
Uncaught exception from servlet
javax.jdo.JDOUserException: Identifier expected at character 1 in "*" at org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:375)
at org.datanucleus.jdo.JDOQuery.execute(JDOQuery.java:230)
at sstooree.SaveInfo.doPost(SaveInfo.java:44)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:102)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
【问题讨论】:
-
“服务器错误”显然会伴随着原因、堆栈跟踪等。将它们保密不会帮助人们向您建议问题出在哪里
-
这个错误发生在 2012-07-15 14:16:11.786 /saveinfo 500 57ms 0kb Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari /536.11 92.253.89.127 - - [15/Jul/2012:14:16:11 -0700] "POST /saveinfo HTTP/1.1" 500 0 "url" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML , 像壁虎) Chrome/20.0.1132.57 Safari/536.11" "myurl" ms=58 cpu_ms=19 api_cpu_ms=0 cpm_usd=0.000613 instance=00c61b117c530c9a537b0089084cba4cb66e15 W 2012-07-15 /14:16:14:16
-
javax.jdo.JDOUserException:在 org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:375) 在 org.datanucleus.jdo.JDOQuery.execute 中的字符 1 处需要标识符(JDOQuery.java:230) 在 sstooree.SaveInfo.doPost(SaveInfo.java:44) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 在 javax.servlet.http.HttpServlet.service(HttpServlet. java:717)
-
所以您使用的查询是错误的......这不是完整的堆栈跟踪。真正的例外是嵌套的。所以把它放在你的帖子中而不是在 cmets 中,并格式化以便它的可读性。
-
好的,但我认为问题是由于@Persistent(mappedBy = "otherclass")
标签: google-app-engine servlets persistence jdo datanucleus