如何解决Maven工程的"nested exception is java.lang.IllegalStateException"异常错误

安迪 2017-10-18 08:57:00
现象:Web工程Login进去之后会不定时刷新页面.但系统不影响使用.输出Exception异常log.

<Log>

{"tag":"Maven_Test-pl","time":"2017/10/17 15:44:58.230","level":"ERROR","kind":"","tid":"","fid":"",E099999 : org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: getOutputStream() has already been called for this response

Caused by: java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:624)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:211)
at org.thymeleaf.spring4.view.ThymeleafView.renderFragment(ThymeleafView.java:335)
at org.thymeleaf.spring4.view.ThymeleafView.render(ThymeleafView.java:189)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1244)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1027)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:971)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
... 44 more

0268D8C570C1F092D199031C9B1BA4E3 /getreports 0:0:0:0:0:0:0:1
user-agent :[Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko]
method :[POST]
content type :[application/x-www-form-urlencoded; charset=UTF-8]
content length:[74]
request headers:[content-type=application/x-www-form-urlencoded; charset=UTF-8,accept=*/*,x-requested-with=XMLHttpRequest,referer=http://localhost:8080/Maven_Test/home,accept-language=en-US,en;q=0.8,ja;q=0.6,zh-Hans-CN;q=0.4,zh-Hans;q=0.2,accept-encoding=gzip, deflate,user-agent=Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko,host=localhost:8080,content-length=74,connection=Keep-Alive,cache-control=no-cache,cookie=JSESSIONID=0268D8C570C1F092D199031C9B1BA4E3; mbox=PC#1506488747119-884425.24_11#1509433793|session#1508224063796-450388#1508226053|check#true#1508224253; s_fid=5C5BA480303F72DA-0C18CB1F102AA4E4; s_nr=1508224401589-Repeat,authorization=Basic bWlkYXN1c2VyOm1pZGFzdXNlcg==]
request params:[reportCategory=99,reportStatus=99,tradeDate=2017/10/17,startDate=すべて]
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.MainSource.earth.servlet.filter.AccessLogFilter.doFilter(AccessLogFilter.java:101)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.MainSource.earth.servlet.filter.ParameterAttackFilter.doFilter(ParameterAttackFilter.java:61)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.MainSource.earth.servlet.filter.RequestRestrictionFilter.doFilter(RequestRestrictionFilter.java:90)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.MainSource.earth.servlet.filter.EncodingFilter.doFilter(EncodingFilter.java:44)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.MainSource.earth.servlet.filter.PoxyFilter.doFilter(PoxyFilter.java:42)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.MainSource.earth.servlet.filter.ParameterLogFilter.doFilter(ParameterLogFilter.java:131)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:478)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:80)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:799)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1457)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:624)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:211)
at org.thymeleaf.spring4.view.ThymeleafView.renderFragment(ThymeleafView.java:335)
at org.thymeleaf.spring4.view.ThymeleafView.render(ThymeleafView.java:189)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1244)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1027)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:971)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
... 44 more
...全文
12776 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianfang 2017-10-20
  • 打赏
  • 举报
回复
引用 13 楼 andymu077 的回复:
知道是为什么了.FilterChain这个的doFilter执行的时候.产生了IllegalStateException异常
2楼+6楼说跟了
安迪 2017-10-19
  • 打赏
  • 举报
回复
我整理了一下出错的再现条件和出问题的地方: 1.只在Controller里return的时候打个断点.debug的时候,如果F5刷新页面,然后在回到eclipse点击F8 继续执行.就会必定发生那个异常. 2.Return是页面路径式的字符串没有问题.如果是josn串的data给前台就会发生那个异常. 3.发生异常应该是在return之后的操作里边. 4.josn串没有问题.如果不是debug停在那里都会正常放回 *怀疑是有时候处理过慢 在还没有返回的时候 刷新页面就会出这种异常
安迪 2017-10-19
  • 打赏
  • 举报
回复
引用 10 楼 tianfang 的回复:
filter.doFilter(req, res); filter中如何使用response的
这个是调用"javax.servlet.FilterChain"的doFilter方法.不是自己写的.
安迪 2017-10-19
  • 打赏
  • 举报
回复
知道是为什么了.FilterChain这个的doFilter执行的时候.产生了IllegalStateException异常
tianfang 2017-10-18
  • 打赏
  • 举报
回复
spring采用 response.getWriter(), 你在jsp中 用 response.getOutputStream()
  • 打赏
  • 举报
回复
引用 3 楼 andymu077 的回复:
[quote=引用 1 楼 long_539437 的回复:] out.clearBuffer();  out = pageContext.pushBody(); 在调用response.getOutputStream()之前加上上面两代码,就ok了!
我的代码是:

try (OutputStream out = response.getOutputStream();
					FileInputStream inputToRead = new FileInputStream(fileToDownload);) {
				response.setContentType("application/x-pdf; charset=UTF-8");
				response.setCharacterEncoding("UTF-8");
				response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + fileName);
				response.setContentLength((int) fileToDownload.length());

				byte[] buffer = new byte[4096];
				int length;
				while ((length = inputToRead.read(buffer)) > -1) {
					out.write(buffer, 0, length);
				}
				logger.info("{}: file downloaded for customerId: {}",fileName,userAccount.getCustomerId());
			} catch (IOException e) {
				logger.error("downloadreport / IO exception");
			}
[/quote] 在处理下载文件转发的jsp页面加<%.....上面内容....%>
tianfang 2017-10-18
  • 打赏
  • 举报
回复
产生这样的异常原因:是web容器生成的servlet代码中有out.write(""),这个和JSP中调用的 response.getOutputStream()产生冲突. 不能既调用 response.getOutputStream(),又调用response.getWriter(),无论先调用哪一个,在调用第二个时候应会抛出 IllegalStateException, 在jsp中,out变量实际上是通过response.getWriter得到的,你的程序中既用了 response.getOutputStream,又用了out变量,故出现以上错误。
安迪 2017-10-18
  • 打赏
  • 举报
回复
贴一下"AccessLogFilter.doFilter"方法的代码:

        @SuppressWarnings("unchecked")
	@Override
	public void doFilter(ServletRequest req, ServletResponse res, FilterChain filter) throws IOException, ServletException {

		try {

			HttpServletRequest request = (HttpServletRequest) req;

			for (int i = 0; i < ignorePathList.size(); i++) {

				String ignorePath = ignorePathList.get(i);

				if (request.getServletPath().startsWith(ignorePath)) {

					filter.doFilter(req, res);

					return;
				}
			}

			String sessionId = "Invalidate session";

			try {

				HttpSession session = request.getSession();
				sessionId = session.getId();

			} catch (IllegalStateException e) {
			}

			MDC.put(MdcLogParameter.MDC_KIND.getId(), PARAM_LOG);
			StringBuilder sb = new StringBuilder(128);
			sb.append(sessionId).append(", ").append(request.getServletPath()).append(":").append(request.getMethod());
			sb.append(", request parameters:[");

			List<String> keys = new ArrayList<String>();
			keys.addAll(request.getParameterMap().keySet());
			int size = keys.size();
			int last = size - 1;

			for (int i = 0; i < size; i++) {

				String key = keys.get(i);
				// When parameter key contains in the maskingParams list, and not debugging mode, the value have to masking.
				String val = maskingParams.contains(key) && (! logger.isDebugEnabled()) ? MASK : request.getParameter(key);

				sb.append(key).append("='").append(val).append("'");
				if (i != last) sb.append(", ");
			}

			sb.append("]");

			logger.info(sb.toString());

		} finally {

			MDC.remove(MdcLogParameter.MDC_KIND.getId());
		}

		filter.doFilter(req, res);
	}
安迪 2017-10-18
  • 打赏
  • 举报
回复
页面login之后 不是每次都会报错.还是不定时的.至今没有找到能准确再现的方法.
安迪 2017-10-18
  • 打赏
  • 举报
回复
引用 6 楼 tianfang 的回复:
spring采用 response.getWriter(), 你在jsp中 用 response.getOutputStream()
但是我没有执行下载的时候 只是login之后就会报错.而且报错的log里边写的文件名字是"com.MainSource.earth.servlet.filter.AccessLogFilter.doFilter(AccessLogFilter.java:101)" 也并不是我的那个controller.也会有关系吗?
  • 打赏
  • 举报
回复
out.clearBuffer();  out = pageContext.pushBody(); 在调用response.getOutputStream()之前加上上面两代码,就ok了!
安迪 2017-10-18
  • 打赏
  • 举报
回复
引用 2 楼 tianfang 的回复:
产生这样的异常原因:是web容器生成的servlet代码中有out.write(""),这个和JSP中调用的 response.getOutputStream()产生冲突. 不能既调用 response.getOutputStream(),又调用response.getWriter(),无论先调用哪一个,在调用第二个时候应会抛出 IllegalStateException, 在jsp中,out变量实际上是通过response.getWriter得到的,你的程序中既用了 response.getOutputStream,又用了out变量,故出现以上错误。
我实在controller里边写的.一个response.getOutputStream() 在这个controller里边没有用到response.getWriter啊
安迪 2017-10-18
  • 打赏
  • 举报
回复
引用 1 楼 long_539437 的回复:
out.clearBuffer();  out = pageContext.pushBody(); 在调用response.getOutputStream()之前加上上面两代码,就ok了!
我的代码是:

try (OutputStream out = response.getOutputStream();
					FileInputStream inputToRead = new FileInputStream(fileToDownload);) {
				response.setContentType("application/x-pdf; charset=UTF-8");
				response.setCharacterEncoding("UTF-8");
				response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + fileName);
				response.setContentLength((int) fileToDownload.length());

				byte[] buffer = new byte[4096];
				int length;
				while ((length = inputToRead.read(buffer)) > -1) {
					out.write(buffer, 0, length);
				}
				logger.info("{}: file downloaded for customerId: {}",fileName,userAccount.getCustomerId());
			} catch (IOException e) {
				logger.error("downloadreport / IO exception");
			}
tianfang 2017-10-18
  • 打赏
  • 举报
回复
filter.doFilter(req, res); filter中如何使用response的

67,514

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧