2012-07-22 81 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