when check server error log, found
net.sf.json.jsonexception: java.util.concurrentmodificationexception @ net.sf.json.jsonobject.defaultbeanprocessing(jsonobject.java:818) @ net.sf.json.jsonobject._frombean(jsonobject.java:699) @ net.sf.json.jsonobject.fromobject(jsonobject.java:172) @ net.sf.json.jsonobject.fromobject(jsonobject.java:134) @ com.j1.mai.model.common.jsonresult.tostring(jsonresult.java:126) @ com.j1.mai.model.common.jsonpbaseaction.write(jsonpbaseaction.java:84) @ com.j1.mai.model.common.jsonpbaseaction.write(jsonpbaseaction.java:65) @ com.j1.mai.action.searchaction.list(searchaction.java:106) @ sun.reflect.generatedmethodaccessor325.invoke(unknown source) @ sun.reflect.delegatingmethodaccessorimpl.invoke(delegatingmethodaccessorimpl.java:25) @ java.lang.reflect.method.invoke(method.java:597) @ org.springframework.web.bind.annotation.support.handlermethodinvoker.invokehandlermethod(handlermethodinvoker.java:176) @ org.springframework.web.servlet.mvc.annotation.annotationmethodhandleradapter.invokehandlermethod(annotationmethodhandleradapter.java:440) @ org.springframework.web.servlet.mvc.annotation.annotationmethodhandleradapter.handle(annotationmethodhandleradapter.java:428) @ org.springframework.web.servlet.dispatcherservlet.dodispatch(dispatcherservlet.java:925) @ org.springframework.web.servlet.dispatcherservlet.doservice(dispatcherservlet.java:856) @ org.springframework.web.servlet.frameworkservlet.processrequest(frameworkservlet.java:936) @ org.springframework.web.servlet.frameworkservlet.doget(frameworkservlet.java:827) @ javax.servlet.http.httpservlet.service(httpservlet.java:617) @ org.springframework.web.servlet.frameworkservlet.service(frameworkservlet.java:812) @ javax.servlet.http.httpservlet.service(httpservlet.java:723) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:290) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206) @ org.springframework.web.filter.characterencodingfilter.dofilterinternal(characterencodingfilter.java:88) @ org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:107) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:235) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206) @ org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:233) @ org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve.java:191) @ org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:127) @ org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:103) @ org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:109) @ org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:293) @ org.apache.coyote.http11.http11aprprocessor.process(http11aprprocessor.java:879) @ org.apache.coyote.http11.http11aprprotocol$http11connectionhandler.process(http11aprprotocol.java:617) @ org.apache.tomcat.util.net.aprendpoint$worker.run(aprendpoint.java:1774) @ java.lang.thread.run(thread.java:662) caused by: java.util.concurrentmodificationexception @ java.util.abstractlist$itr.checkforcomodification(abstractlist.java:372) @ java.util.abstractlist$itr.next(abstractlist.java:343) @ org.apache.commons.collections.iterators.abstractiteratordecorator.next(abstractiteratordecorator.java:67) @ org.apache.commons.collections.map.listorderedmap$listorderediterator.next(listorderedmap.java:605) @ net.sf.json.jsonobject.hashcode(jsonobject.java:2114) @ java.util.hashmap.put(hashmap.java:372) @ java.util.hashset.add(hashset.java:200) @ net.sf.json.abstractjson.addinstance(abstractjson.java:63) @ net.sf.json.jsonobject._fromjsonobject(jsonobject.java:900) @ net.sf.json.jsonobject.fromobject(jsonobject.java:155) @ net.sf.json.jsonserializer.tojson(jsonserializer.java:108) @ net.sf.json.abstractjson._processvalue(abstractjson.java:238) @ net.sf.json.jsonobject._processvalue(jsonobject.java:2655) @ net.sf.json.jsonobject.processvalue(jsonobject.java:2721) @ net.sf.json.jsonobject.setinternal(jsonobject.java:2736) @ net.sf.json.jsonobject.setvalue(jsonobject.java:1424) @ net.sf.json.jsonobject.defaultbeanprocessing(jsonobject.java:765) ... 36 more
the jsonresult
class
public class jsonresult implements serializable { static logger log = logger.getlogger(jsonresult.class); private static final long serialversionuid = 248463127163578297l; private string status; private string msg; private jsonobject data; public jsonresult() { this.setsuccess(); this.data = new jsonobject(); } public string getstatus() { return status; } public jsonresult setstatus(string status) { this.status = status; return this; } public jsonresult setsuccess() { this.status = msgstatus.normal.getcode(); return this; } public jsonresult setfailure() { this.status = msgstatus.exception.getcode(); return this; } public string getmsg() { return msg; } public jsonresult setmsg(string msg) { this.msg = msg; return this; } public jsonobject getdata() { return data; } public boolean success() { return this.status.equals(msgstatus.normal.getcode()); } public jsonresult setdata(jsonobject data) { this.data = data; return this; } public jsonresult put(object key, object val) { if (val != null) this.data.put(key, val); return this; } public jsonresult setobjdata(object o) { if (o == null) return this; try { if (o.getclass().equals(jsonobject.class)) { this.data = (jsonobject) o; } else { this.data = jsonobject.fromobject(o); } } catch (exception e) { log.error(e.getmessage(), e); } return this; } public jsonresult putobjdata(object o) { if (o == null) return this; jsonobject jo = null; try { if (o.getclass().equals(jsonobject.class)) { jo = (jsonobject) o; } else { jo = jsonobject.fromobject(o); } if (jo != null) this.data.putall(jo); } catch (exception e) { log.error(e.getmessage(), e); } return this; } public jsonresult clear() { this.getdata().clear(); this.setsuccess(); this.setmsg(""); return this; } @override public string tostring() { return jsonobject.fromobject(this).tostring(); } }
and jsonpbaseaction.write
code
protected jsonresult _result = new jsonresult(); public void write(httpservletrequest request, httpservletresponse response, string callback) { response.setcontenttype("text/html;charset=utf-8"); response.setcharacterencoding("utf-8"); string result = null; printwriter writer = null; try { writer = response.getwriter(); if (stringutil.isempty(callback)) result = _result.tostring(); else result = callback + "(" + _result.tostring() + ")"; } catch (exception e) { logger.error(e.getmessage(), e); } { if (writer != null) { writer.write(result); writer.close(); } if (result != null) _result.clear(); } }
i think didn't modify jsonobject
while write.
why concurrentmodificationexception
?
instances of jsonobject
not thread-safe. see documentation.
as can see code:
the write
method called multiple threads , alters _result
, causes exception.