从列表中删除第二项会使 REST 崩溃 API
Removing second item from a list crashes REST API
我正在尝试向我的 REST API 添加一个功能,它按年份过滤数据,因此只有对象会显示与我请求的年份相同的对象。
我用来测试此功能的路径是
http://localhost:8080/Assignment2C/beers?year=2019
出现 500 错误
在Beers_Service.java第二次遍历列表失败的地方
public List<Beers> getAllBeersByYear(int year) {
EntityManager em = DBUtil.getEMF().createEntityManager();
List<Beers> list = null;
try {
list = em.createNamedQuery("Beers.findAll", Beers.class)
.getResultList();
if (list == null || list.isEmpty()) {
list = null;
}
} finally {
em.close();
}
Calendar cal = Calendar.getInstance();
for(Beers beer: list){
cal.setTime(beer.getLastMod());
if(cal.get(Calendar.YEAR)!=year){
list.remove(beer);
}
}
return list;
数据库中的所有日期都是 2019 年,除了第一个对象是 2018 年
使用调试器时,它会遍历 for 循环,因为数据库中的第一个条目是 2018,所以它会很好地删除它,在删除对象后,它会返回到 for 循环的顶部并在此处线路崩溃。
for(Beers beer: list){
在中断 for 循环后处于调试模式时,它会进入
中的源代码
beforeExecute(wt, task);
try {
task.run();
afterExecute(task, null);
} catch (Throwable ex) {
afterExecute(task, ex);
throw ex;
}
行
afterExecute(task, null);
我得到的堆栈跟踪是
<h1>HTTP Status 500 – Internal Server Error</h1>
<hr class="line" />
<p><b>Type</b> Exception Report</p>
<p><b>Message</b> Request processing failed; nested exception is java.util.ConcurrentModificationException</p>
<p><b>Description</b> The server encountered an unexpected condition that prevented it from fulfilling the request.
</p>
<p><b>Exception</b></p>
<pre>org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.util.ConcurrentModificationException
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
</pre>
<p><b>Root Cause</b></p>
<pre>java.util.ConcurrentModificationException
java.base/java.util.Vector$Itr.checkForComodification(Vector.java:1320)
java.base/java.util.Vector$Itr.next(Vector.java:1276)
main.Beers_Service.getAllBeersByYear(Beers_Service.java:53)
main.Beers_Controller.GetAllBreweries(Beers_Controller.java:72)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.base/java.lang.reflect.Method.invoke(Method.java:567)
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
您不应在遍历集合时修改集合:
https://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html
" 例如,如果线程在使用快速失败迭代器迭代集合时直接修改集合,则迭代器将抛出此异常。"
我正在尝试向我的 REST API 添加一个功能,它按年份过滤数据,因此只有对象会显示与我请求的年份相同的对象。
我用来测试此功能的路径是
http://localhost:8080/Assignment2C/beers?year=2019
出现 500 错误
在Beers_Service.java第二次遍历列表失败的地方
public List<Beers> getAllBeersByYear(int year) {
EntityManager em = DBUtil.getEMF().createEntityManager();
List<Beers> list = null;
try {
list = em.createNamedQuery("Beers.findAll", Beers.class)
.getResultList();
if (list == null || list.isEmpty()) {
list = null;
}
} finally {
em.close();
}
Calendar cal = Calendar.getInstance();
for(Beers beer: list){
cal.setTime(beer.getLastMod());
if(cal.get(Calendar.YEAR)!=year){
list.remove(beer);
}
}
return list;
数据库中的所有日期都是 2019 年,除了第一个对象是 2018 年
使用调试器时,它会遍历 for 循环,因为数据库中的第一个条目是 2018,所以它会很好地删除它,在删除对象后,它会返回到 for 循环的顶部并在此处线路崩溃。
for(Beers beer: list){
在中断 for 循环后处于调试模式时,它会进入
中的源代码 beforeExecute(wt, task);
try {
task.run();
afterExecute(task, null);
} catch (Throwable ex) {
afterExecute(task, ex);
throw ex;
}
行
afterExecute(task, null);
我得到的堆栈跟踪是
<h1>HTTP Status 500 – Internal Server Error</h1>
<hr class="line" />
<p><b>Type</b> Exception Report</p>
<p><b>Message</b> Request processing failed; nested exception is java.util.ConcurrentModificationException</p>
<p><b>Description</b> The server encountered an unexpected condition that prevented it from fulfilling the request.
</p>
<p><b>Exception</b></p>
<pre>org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.util.ConcurrentModificationException
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
</pre>
<p><b>Root Cause</b></p>
<pre>java.util.ConcurrentModificationException
java.base/java.util.Vector$Itr.checkForComodification(Vector.java:1320)
java.base/java.util.Vector$Itr.next(Vector.java:1276)
main.Beers_Service.getAllBeersByYear(Beers_Service.java:53)
main.Beers_Controller.GetAllBreweries(Beers_Controller.java:72)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.base/java.lang.reflect.Method.invoke(Method.java:567)
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
您不应在遍历集合时修改集合: https://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html
" 例如,如果线程在使用快速失败迭代器迭代集合时直接修改集合,则迭代器将抛出此异常。"