【问题标题】:Google App Engine / Java : ConcurrentModificationException thrown when using session.setAttribute()Google App Engine / Java:使用 session.setAttribute() 时抛出 ConcurrentModificationException
【发布时间】:2012-07-21 04:09:12
【问题描述】:

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

这是怎么回事?我该怎么办?

这是损坏的 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");
    }
}

谢谢!

【问题讨论】:

  • 查看下面的解决方案...但现在我很好奇:为什么它在本地版本上运行良好?

标签: java google-app-engine session google-cloud-datastore


【解决方案1】:

您在会话中也打开了一个枚举。

枚举名称 = 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;

}

【讨论】:

  • 好吧,这很有意义!实际上,我在这个 servlet 和使用返回的数据时重定向到的页面上遇到了两次这个问题......所以我一开始以为你错了,但你是对的!感谢您的解决方案!
猜你喜欢
  • 2017-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多