您的位置:首页 > 编程语言 > Java开发

使用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()输出流。

关键代码:

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐