转载: 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 全局异常的更多相关文章

  1. SSM之全局异常处理器

    1. 异常处理思路 首先来看一下在springmvc中,异常处理的思路:   如上图所示,系统的dao.service.controller出现异常都通过throws Exception向上抛出,最后 ...

  2. 使用spring利用HandlerExceptionResolver实现全局异常捕获

    最近一直没有时间更新是因为一直在更新自己使用的框架. 之后会慢慢带来对之前使用的spring+mvc+mybatis的优化. 会使用一些新的特性,实现一些新的功能. 我会尽量分离业务,封装好再拿出来. ...

  3. springmvc 全局异常解决方案

    系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生. 系统的dao.service. ...

  4. SpringBoot学习笔记(二):SpringBoot访问静态文件、捕获全局异常、集成Thymeleaf、集成JSP

    SpringBoot访问静态文件 什么是静态文件? 不需要通过web容器去得到的文件,直接通过路径就能得到的文件,比如项目的css,js,img等文件. 所有的资源文件都应该在src/main/res ...

  5. 13.SpringMVC之全局异常

    我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生.在开发中,不管是dao层 ...

  6. 在C#代码中应用Log4Net(四)在Winform和Web中捕获全局异常

    毕竟人不是神,谁写的程序都会有bug,有了bug不可怕,可怕的是出错了,你却不知道错误在哪里.所以我们需要将应用程序中抛出的所有异常都记录起来,不然出了错,找问题就能要了你的命.下面我们主要讨论的是如 ...

  7. MVC 好记星不如烂笔头之 ---> 全局异常捕获以及ACTION捕获

    public class BaseController : Controller { /// <summary> /// Called after the action method is ...

  8. spring设置全局异常处理器

    1.spring设置全局异常,它的原理是向上捕获 spring.xml配置 <!--自定义全局异常处理器--> <bean id="globalExceptionResol ...

  9. atitit.js浏览器环境下的全局异常捕获

    atitit.js浏览器环境下的全局异常捕获 window.onerror = function(errorMessage, scriptURI, lineNumber) { var s= JSON. ...

随机推荐

  1. CUDA2.4-原理之性能优化及浮点运算

    本部分来自于<大规模并行处理器编程实战>第六章.第七章.打算不再看这本书了,准备看<programming massively parallel processors 2nd> ...

  2. DB2编目配置及管理

    打开命令:db2cmd 我一般打开的方式如下:                       (在db2)                                                 ...

  3. 20155235 《网络攻防》 实验八 Web基础

    20155235 <网络攻防> 实验八 Web基础 实验内容 Web前端HTML(0.5分) 能正常安装.启停Apache.理解HTML,理解表单,理解GET与POST方法,编写一个含有表 ...

  4. 20155306 白皎 免考实践总结——0day漏洞

    本次免考实践提纲及链接 第一部分 基础知识 1.1 0day漏洞概述 1.2二进制文件概述 1.3 必备工具 1.4 crack实验 第二部分 漏洞利用 2.1栈溢出利用 2.1.1 系统栈工作原理 ...

  5. MiZ702学习笔记8——让MiZ702变身PC的方法

    首先你需要一个安装好的linux系统,这里我用的是Ubuntu的虚拟机.VMWare的话,选择较高版本的成功率会高些(当然根据自己电脑的配置进行选择). 打开Ubuntu的虚拟机,找到一个叫做Disk ...

  6. ubuntu 桌面操作系统安装WPS办公软件的方法

    1.打开ubuntu系统自带的firefox软件 2.打开linux.wps.cn,并点击立即下载 3. 点击下载deb安装包 4.进入下载目录,sudo dpkg -i wps-office_10. ...

  7. python3 简单进度条代码

    进度条代码函数实现 import sys, time class ShowProcess(object): """ 显示处理进度的类 调用该类相关函数即可实现处理进度的显 ...

  8. 并发编程(Concurrent programming)

    并发编程(Concurrent programming) 1.并发编程概述 2.委托(delegate) 3.事件(event) 4.线程(thread) 5.线程池(threadPool) 6.任务 ...

  9. 12、利用docker快速搭建Wordpress网站

    一.准备工作 结构图: 用户访问页面,Nginx将请求进行转发,如果请求的是php页面,则通过FastCGI转发给后端php进行处理:如果非php页面,则直接返回静态页面. 关键点: mysql.ph ...

  10. 《Effective Java》学习笔记 —— 序列化

    Java的序列化API提供了一个框架,用来将对象编码成一个字节流(序列化,serializing),并从字节流中重新创建对象(反序列化, deserializing). 第74条 谨慎地实现Seria ...