SSM 全局异常
转载: http://blog.csdn.net/m13321169565/article/details/7641978
废话不多,直接说重点。
一 创建异常拦截类
(这里将 webapi 和 web异常放在一起处理。但是文件夹是两个的。关于 LogHelper.WebLog和LogHelper.ApiLog)
参见文章:http://blog.csdn.net/hanjun0612/article/details/72639867
public class AnnotationHandlerMethodExceptionResolver extends ExceptionHandlerExceptionResolver {
private String defaultErrorView;
public String getDefaultErrorView() {
return defaultErrorView;
}
public void setDefaultErrorView(String defaultErrorView) {
this.defaultErrorView = defaultErrorView;
}
/***
* 异常后跳转到页面
*/
protected ModelAndView doResolveHandlerMethodException(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod, Exception exception) {
try {
if (handlerMethod == null) {
return null;
}
Method method = handlerMethod.getMethod();
if (method == null) {
return null;
}
ModelAndView returnValue = super.doResolveHandlerMethodException(request, response, handlerMethod, exception);
ResponseBody responseBodyAnn = AnnotationUtils.findAnnotation(method, ResponseBody.class);
if (responseBodyAnn != null) {
ResponseStatus responseStatusAnn = AnnotationUtils.findAnnotation(method, ResponseStatus.class);
if (responseStatusAnn != null) {
HttpStatus responseStatus = responseStatusAnn.value();
String reason = responseStatusAnn.reason();
if (!StringUtils.hasText(reason)) {
response.setStatus(responseStatus.value());
} else {
response.sendError(responseStatus.value(), reason);
}
}
return handleResponseBody(returnValue, request, response);
}
if (returnValue.getViewName() == null) {
returnValue.setViewName(defaultErrorView);
}
return returnValue;
} catch (Exception e) {
LogerHelper.WebLog(e.getMessage());
return null;
}
}
/**
* 异常后 返回json
*
* @param returnValue
* @param request
* @param response
* @return
* @throws ServletException
* @throws IOException
*/
@SuppressWarnings({"unchecked", "rawtypes"})
private ModelAndView handleResponseBody(ModelAndView returnValue, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
Map value = returnValue.getModelMap();
HttpInputMessage inputMessage = new ServletServerHttpRequest(request);
List<MediaType> acceptedMediaTypes = inputMessage.getHeaders().getAccept();
if (acceptedMediaTypes.isEmpty()) {
acceptedMediaTypes = Collections.singletonList(MediaType.ALL);
}
MediaType.sortByQualityValue(acceptedMediaTypes);
HttpOutputMessage outputMessage = new ServletServerHttpResponse(response);
Class<?> returnValueType = value.getClass();
List<HttpMessageConverter<?>> messageConverters = super.getMessageConverters();
if (messageConverters != null) {
for (MediaType acceptedMediaType : acceptedMediaTypes) {
for (HttpMessageConverter messageConverter : messageConverters) {
if (messageConverter.canWrite(returnValueType, acceptedMediaType)) {
messageConverter.write(value, acceptedMediaType, outputMessage);
return new ModelAndView();
}
}
}
}
if (logger.isWarnEnabled()) {
logger.warn("Could not find HttpMessageConverter that supports return type [" + returnValueType + "] and " + acceptedMediaTypes);
}
return null;
} catch (Exception e) {
LogerHelper.ApiLog(e.getMessage());
return null;
}
}
}
二 添加xml配置
找到springmvc-servlet.xml
添加:
<bean id="handlerExceptionResolver" class="com.sanju.sanjuSCM.ExceptionResolver.AnnotationHandlerMethodExceptionResolver">
<property name="defaultErrorView" value="error/500.jsp"/> <!--错误页面-->
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
<!-- JSON转换器无需设置mediaType,由外部客户端调用时,手动设置相关mediaType -->
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" />
</list>
</property>
</bean>
就完成了!
====================================================================================
下面是我项目中用到的。
配置文件和上面的还是一样
public class AnnotationHandlerMethodExceptionResolver extends ExceptionHandlerExceptionResolver {
private String defaultErrorView;
public String getDefaultErrorView() {
return defaultErrorView;
}
public void setDefaultErrorView(String defaultErrorView) {
this.defaultErrorView = defaultErrorView;
}
/***
* 异常后跳转到页面
*/
protected ModelAndView doResolveHandlerMethodException(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod, Exception exception) {
Method method=null;
ModelAndView returnValue=null;
try {
if (handlerMethod == null) {
return null;
}
method = handlerMethod.getMethod();
if (method == null) {
return null;
}
returnValue = super.doResolveHandlerMethodException(request, response, handlerMethod, exception);
//这里获取 @RestController和普通 @ResponseBody 的两种注解情况
Annotation restControllerAnn = method.getDeclaringClass().getAnnotation(RestController.class);
Annotation responseBodyAnn = restControllerAnn==null
?AnnotationUtils.findAnnotation(method, ResponseBody.class)
:restControllerAnn;
if (responseBodyAnn != null) {
ResponseStatus responseStatusAnn = AnnotationUtils.findAnnotation(method, ResponseStatus.class);
if (responseStatusAnn != null) {
HttpStatus responseStatus = responseStatusAnn.value();
String reason = responseStatusAnn.reason();
if (!StringUtils.hasText(reason)) {
response.setStatus(responseStatus.value());
} else {
response.sendError(responseStatus.value(), reason);
}
}
return handleResponseBody(returnValue, request, response,handlerMethod,exception);
}
if (returnValue.getViewName() == null) {
returnValue.setViewName(defaultErrorView);
}
return returnValue;
} catch (Exception e) {
SimpleDateFormat formatter =new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss"); ;
String exMsg="\r\n\r\n============================================================\r\n";
exMsg+="Date : "+(formatter.format(new Date()))+"\r\n\n";
exMsg+="ErrorMsg : "+exception+"\r\n\n";
exMsg+="ClassName : "+handlerMethod.getBean().getClass()+"\r\n\n";
exMsg+="MethodName : "+handlerMethod.getMethod().getName()+"\r\n\n";
exMsg+="Exception : "+handlerMethod +"\r\n\n";
LogerHelper.WebLog(exMsg);
return null;
}
}
/**
* 异常后 返回json
*
* @param returnValue
* @param request
* @param response
* @return
* @throws ServletException
* @throws IOException
*/
@SuppressWarnings({"unchecked", "rawtypes"})
private ModelAndView handleResponseBody(ModelAndView returnValue, HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod, Exception exception) throws Exception {
ResultModel rm=new ResultModel();
rm.setMessage(exception.getMessage());
try {
String json= JsonConvert.toJSON(rm);
response.getWriter().write(json);
response.getWriter().flush();
response.getWriter().close();
return null;
} catch (Exception e) {
SimpleDateFormat formatter =new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss"); ;
String exMsg="\r\n\r\n============================================================\r\n";
exMsg+="Date : "+(formatter.format(new Date()))+"\r\n\n";
exMsg+="reqString : "+request.getParameter("reqString")+"\r\n";
exMsg+="sign : "+request.getParameter("sign") +"\r\n";
exMsg+="ErrorMsg : "+exception+"\r\n\n";
exMsg+="ClassName : "+handlerMethod.getBean().getClass()+"\r\n\n";
exMsg+="MethodName : "+handlerMethod.getMethod().getName()+"\r\n\n";
exMsg+="Exception : "+handlerMethod +"\r\n\n";
LogerHelper.ApiLog(exMsg);
rm.setMessage(e.getMessage());
String json= JsonConvert.toJSON(rm);
response.getWriter().write(json);
response.getWriter().flush();
response.getWriter().close();
}
return null;
}
}
SSM 全局异常的更多相关文章
- SSM之全局异常处理器
1. 异常处理思路 首先来看一下在springmvc中,异常处理的思路: 如上图所示,系统的dao.service.controller出现异常都通过throws Exception向上抛出,最后 ...
- 使用spring利用HandlerExceptionResolver实现全局异常捕获
最近一直没有时间更新是因为一直在更新自己使用的框架. 之后会慢慢带来对之前使用的spring+mvc+mybatis的优化. 会使用一些新的特性,实现一些新的功能. 我会尽量分离业务,封装好再拿出来. ...
- springmvc 全局异常解决方案
系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生. 系统的dao.service. ...
- SpringBoot学习笔记(二):SpringBoot访问静态文件、捕获全局异常、集成Thymeleaf、集成JSP
SpringBoot访问静态文件 什么是静态文件? 不需要通过web容器去得到的文件,直接通过路径就能得到的文件,比如项目的css,js,img等文件. 所有的资源文件都应该在src/main/res ...
- 13.SpringMVC之全局异常
我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生.在开发中,不管是dao层 ...
- 在C#代码中应用Log4Net(四)在Winform和Web中捕获全局异常
毕竟人不是神,谁写的程序都会有bug,有了bug不可怕,可怕的是出错了,你却不知道错误在哪里.所以我们需要将应用程序中抛出的所有异常都记录起来,不然出了错,找问题就能要了你的命.下面我们主要讨论的是如 ...
- MVC 好记星不如烂笔头之 ---> 全局异常捕获以及ACTION捕获
public class BaseController : Controller { /// <summary> /// Called after the action method is ...
- spring设置全局异常处理器
1.spring设置全局异常,它的原理是向上捕获 spring.xml配置 <!--自定义全局异常处理器--> <bean id="globalExceptionResol ...
- atitit.js浏览器环境下的全局异常捕获
atitit.js浏览器环境下的全局异常捕获 window.onerror = function(errorMessage, scriptURI, lineNumber) { var s= JSON. ...
随机推荐
- 从裸机编程到嵌入式Linux编程思想的转变------分而治之:驱动和应用程序
笔者学习嵌入式Linux也有一段时间了,很奇怪的是很多书讲驱动编程方面的知识,也有很多书将ARM9方面的知识,但是从以前51形式的(对寄存器直接操作,初始化芯片的功能模块)编程方法,和思维模式,变换为 ...
- SelectObject函数
SelectObject 函数功能:该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的同样类型的对象. 函数原型:HGDIOBJ SelectObject(HDC hdc, HGDIOBJ ...
- ubuntu系统中添加DNS服务器地址后诡异消失的解决办法
今天查看了一下自己电脑里的ubuntu14.04系统,发现无法上网,于是ping了一下百度,出现unknown host,查了一下/etc/resolv.conf中的DNS地址,却发现我之前的修改被清 ...
- DDD China Conference 2017
DDD China Conference 2017 时间:2017.12.9地点:国际会议中心
- 网络对抗技术 2017-2018-2 20152515 Exp4 恶意代码分析
1.实验后回答问题 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用什么方法来监控. 答:- 我会使用sysmon工具来 ...
- 20155334 《网络攻防》 Exp7 网络欺诈防范
20155334 <网络攻防> Exp7 网络欺诈防范 一.基础问题回答 通常在什么场景下容易受到DNS spoof攻击 同一局域网下,以及各种公共网络. 在日常生活工作中如何防范以上两攻 ...
- js实现60秒倒计时效果(使用了jQuery)
今天碰到要实现一个类似那种短信验证码60秒倒计时的需求,好久不写js,有点手生.把代码记录下,方便后续查阅. 这里我用了jQuey,毕竟写起来简洁点.下面直接看效果和代码. 一.效果 ...
- python 翻转棋(othello)
利用上一篇的框架,再写了个翻转棋的程序,为了调试minimax算法,花了两天的时间. 几点改进说明: 拆分成四个文件:board.py,player.py,ai.py,othello.py.使得整个结 ...
- Selenium之前世今生
前世 Selenium RC 早期的Selenium使用的是JavaScript注入技术与浏览器打交道,需要Selenium RC启动一个Server,将操作Web元素的API调用转化为一段段Java ...
- Unity Inspector添加自定义按钮(Button)
在Unity开发游戏的时候,为了有一个更快更方便的工作流,我们往往会在Editor下开发一些方便实用的工具.在工具中,用到最多,最关键的就是按钮,它是工具的首席执行官.下面就用最简单的代码来演示添加一 ...