2012-07-22 77 views
0

本地一切正常,但部署时,我得到ConcurrentModificationException当我从一个servlet使用session.setAttribute()时抛出。在使用HTML表单添加实体后,我使用它从数据存储返回值。Google App Engine/Java:使用session.setAttribute()时抛出ConcurrentModificationException异常()

怎么回事,我该怎么办呢?

这里是破碎的servlet:

public class AdminServlet extends HttpServlet { 
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { 
     Boolean logged = false; 
     HttpSession session = req.getSession(true); 
     Enumeration<String> names = session.getAttributeNames(); 

     while(names.hasMoreElements()) { 
      String name = (String) names.nextElement(); 

      if(name.equals("logged")) { 
       logged = (Boolean) session.getAttribute("logged"); 
      } 
     } 

     if(logged) { 
      String p1 = req.getParameter("name"); 
      String p2 = req.getParameter("value"); 

      if(p1 != "" && p2 != "") { 
       Entity e= new Entity("MyEntity"); 
       e.setProperty("name", p1); 
       e.setProperty("value", p2); 

       DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 
       Transaction txn = datastore.beginTransaction(); 

       Key k = datastore.put(e); 

       txn.commit(); 

       if(txn.isActive()) 
        txn.rollback(); 

       session.setAttribute("returnedKey", KeyFactory.keyToString(k)); // CRASHES HERE 
      } 
     } 

     resp.sendRedirect("adminpage.jsp"); 
    } 
} 

谢谢!

+0

请参阅解决方案的方法...但现在我很好奇:为什么它能在本地版本上正常工作? – user1394563 2012-07-23 12:44:15

回答

0

您还有一个在会话中打开的枚举。

Enumeration names = session.getAttributeNames();

在会话中更改属性会影响名称,这就是您看到错误的原因。

试着写代码,以便名称不使用(归零或超出范围):

它会很容易把它放在下面

public boolean logLogged(HttpSession session){ 

    Enumeration<String> names = session.getAttributeNames(); 

    boolean loggedTmp=false; 

    while(names.hasMoreElements()){ 

     String name = (String) names.nextElement(); 

     if(name.equals("logged")){ 
      loggedTmp = (Boolean) session.getAttribute("logged"); 
     } 
    } 

    return loggedTmp; 

} 
+0

好的,这很有道理!在这个servlet和我在使用返回数据的过程中,我实际上遇到了这个问题两次,所以我认为你起初有点不对,但你是对的!感谢您的解决方案! – user1394563 2012-07-22 23:31:42

+0

很高兴解决了! – user1258245 2012-07-22 23:37:54