我有一个使用Spring3.2.11.RELEASE的web应用程序,运行在JBoss 7.1.3.Final上。
应用程序在单个应用程序服务器上运行。
奇怪的是,有时我的应用程序会在特定的控制器方法上出现间歇性的java.lang.IllegalStateException:
@RequestMapping(value = "/sync", method = RequestMethod.POST)
public void sync(@RequestParam final String orgId,
final HttpServletResponse response) throws IOException
{
response.setBufferSize(1024);…
response.setBufferSize方法偶尔会产生下面的错误,尽管它是我的方法的第一行:
13:47:40,954 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/clever].[dispatcher]] (http-/127.0.0.1:8081-1) Servlet.service() for servlet dispatcher threw exception: java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.setBufferSize(ResponseFacade.java:234) [jbossweb-7.0.17.Final.jar:]
at org.collegeboard.springboard.clever.controller.CleverOrganizationController.sync(CleverOrganizationController.java:112) [classes:]
at sun.reflect.GeneratedMethodAccessor1017.invoke(Unknown Source) [:1.6.0_65]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [rt.jar:1.6.0_65]
at java.lang.reflect.Method.invoke(Method.java:597) [rt.jar:1.6.0_65]
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) [spring-web-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) [spring-web-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) [spring-webmvc-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) [spring-webmvc-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:685) [spring-webmvc-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) [spring-webmvc-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:919) [spring-webmvc-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:851) [spring-webmvc-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953) [spring-webmvc-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855) [spring-webmvc-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) [jboss-servlet-api_3.0_spec-1.0.1.Final.jar:1.0.1.Final]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829) [spring-webmvc-3.2.11.RELEASE.jar:3.2.11.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [jboss-servlet-api_3.0_spec-1.0.1.Final.jar:1.0.1.Final]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.17.Final.jar:]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.17.Final.jar:]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.17.Final.jar:]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.17.Final.jar:]
at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:165) [jboss-as-web-7.1.3.Final.jar:7.1.3.Final]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.17.Final.jar:]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.17.Final.jar:]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.17.Final.jar:]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:372) [jbossweb-7.0.17.Final.jar:]
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.17.Final.jar:]
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:679) [jbossweb-7.0.17.Final.jar:]
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:931) [jbossweb-7.0.17.Final.jar:]
at java.lang.Thread.run(Thread.java:680) [rt.jar:1.6.0_65] 有什么办法让这件事一去不复返吗?
发布于 2015-09-04 04:37:45
在提交之前,您应该更早地调用setBufferSize。您可以通过在ServletResponse对象上调用isCommitted()来检查它是否已经提交。isCommitted()的文档指出:
已提交响应已写入其状态代码和标头。
这也发生在我身上,当在ServletResponse上调用setBufferSize时太晚了。对于您来说,这可能是一个线程问题,这就解释了为什么这种情况会不稳定地发生。
当您获得IllegalStateException时,setBufferSize(int)文档会进行说明
必须在写入任何响应正文内容之前调用此方法;如果已写入内容或已提交响应对象,则此方法将引发IllegalStateException。‘
发布于 2015-09-03 19:20:56
我无法评论,所以添加评论作为答案,如果它可能对你有帮助的话。只要检查一下jsp中是否有autoFlush=true,这可能是原因。您还可以在设置响应缓冲区大小之前,在控制器方法中使用response.isCommitted()进行检查。
发布于 2015-08-29 02:16:20
可能spring已经在响应中写了一些东西。例如,如果您声明了一个modelAtribute。
https://stackoverflow.com/questions/32142645
复制相似问题