使用Spring实现异常统一处理【三】--java.lang.IllegalStateException: STREAM问题的解决
2015-04-23 10:28
851 查看
在《使用Spring实现异常统一处理【二】》中,在处理JSON转换的异常时,自定义异常处理类,自个就报java.lang.IllegalStateException: STREAM错误,原因为:在该自定义异常处理类中,使用了response.getWriter()进行错误信息输出,而Spring的MappingJackson2HttpMessageConverter应该通过response.getOutputStream(),已获取了输出流。
在servlet标准中,是不允许同时使用response.getWriter()和response.getOutputStream()的,所以报java.lang.IllegalStateException: STREAM错误。
原因知道了,解决方案就有谱了:在获取response.getWriter()出错时,就改用response.getOutputStream()输出流。
关键代码:
完整代码:
在servlet标准中,是不允许同时使用response.getWriter()和response.getOutputStream()的,所以报java.lang.IllegalStateException: STREAM错误。
原因知道了,解决方案就有谱了:在获取response.getWriter()出错时,就改用response.getOutputStream()输出流。
关键代码:
String returnStr="{error:'"+exception.getMessage()+"'}"; try { <span style="white-space:pre"> </span>writer = response.getWriter(); <span style="white-space:pre"> </span>writer.write(returnStr); <span style="white-space:pre"> </span>writer.flush(); <span style="white-space:pre"> </span>writer.close(); } catch (Exception e) { <span style="white-space:pre"> </span>try { <span style="white-space:pre"> </span>OutputStream output=response.getOutputStream(); <span style="white-space:pre"> </span>output.write(returnStr.getBytes("UTF-8")); <span style="white-space:pre"> </span>output.flush(); <span style="white-space:pre"> </span>output.close(); <span style="white-space:pre"> </span>} catch (Exception e1) { <span style="white-space:pre"> </span>e1.printStackTrace(); <span style="white-space:pre"> </span>} }
完整代码:
public class CustomSimpleMappingExceptionResolver extends SimpleMappingExceptionResolver { @Override protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) { if (handler == null) { return null; } HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); if (method == null) { return null; } Class<?> methodReturnType=method.getReturnType(); ResponseBody responseBody = AnnotationUtils.findAnnotation(method, ResponseBody.class); if (methodReturnType.getName().equals("void")||responseBody != null) { PrintWriter writer; String returnStr="{error:'"+exception.getMessage()+"'}"; try { writer = response.getWriter(); writer.write(returnStr); writer.flush(); writer.close(); } catch (Exception e) { try { OutputStream output=response.getOutputStream(); output.write(returnStr.getBytes("UTF-8")); output.flush(); output.close(); } catch (Exception e1) { e1.printStackTrace(); } } } else { String viewName = super.determineViewName(exception, request); if (viewName != null) {// JSP格式返回 Integer statusCode = super.determineStatusCode(request, viewName); if (statusCode != null) { super.applyStatusCodeIfPossible(request, response, statusCode); } return super.getModelAndView(viewName, exception, request); } } return new ModelAndView(); }// doResolveException }
<bean id="exceptionResolver" class="com.winssage.exception.CustomSimpleMappingExceptionResolver"> <property name="defaultErrorView" value="/exception/errorpage" /> <!-- 定义异常处理页面用来获取异常信息的变量名,如果不添加exceptionAttribute属性,则默认为exception--> <property name="exceptionAttribute" value="exception" /> <property name="exceptionMappings"> <props> <!--不设置将根据defaultErrorView--> <prop key="java.lang.exception">/exception/errorpage</prop> <prop key="java.lang.RuntimeException">/exception/errorpage</prop> </props> </property> <!-- order=0,则无法在先在Controller通过注解进行异常处理,order=1刚刚好--> <property name="order" value="1"/> </bean>
<%@page contentType="text/html" pageEncoding="UTF-8" isErrorPage="true"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page</title> </head> <body> <h1>Hello World!error!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ${exception} </h1> </body> </html>
相关文章推荐
- 使用spring实现事务管理(@transactional)的遇到的两个异常:java.lang.noclassdeffounderror:org/objectweb.asm
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...今天
- spring boot jpa-java.lang.IllegalArgumentException: Not a managed type异常问题解决方法
- 使用Spring实现异常统一处理【一】
- 使用Spring实现异常统一处理【二】
- 使用Spring实现异常统一处理【四】--error-page中对异常进行log
- 解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ...
- 异常-----springmvc + ajaxfileupload解决ajax不能异步上传图片的问题。java.lang.ClassCastException: org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.
- Spring 使用注解注入,调用类实例出现 java.lang.NullPointException 问题的解决方法
- Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群
- idea上使用maven分模块开发时解决spring注入失败问题java.lang.IllegalStateException: Failed to load ApplicationContext
- java.lang.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener问题解决
- IntelliJ IDEA中Spring Boot项目使用spring-boot-devtools无法实现热部署/热更新的问题解决
- SpringBoot 统一异常处理--- @ControllerAdvice 使用
- Spring Cloud zuul自定义统一异常处理实现
- 【问题解决】 java.lang.NoSuchMethodError: org.springframework.util.ObjectUtils.unwrapOptional(Ljava/lang/O
- 使用Tomcat实现Java连接池(解决main中不能够调用问题)
- 正确使用MySQL JDBC setFetchSize()方法解决JDBC处理大结果集 java.lang.OutOfMemoryError: Java heap space
- 前后端分离 SSM 统一异常处理 解决404不被拦截的问题