zoukankan      html  css  js  c++  java
  • springmvc全局异常后返回JSON异常数据

    转自:http://www.cnblogs.com/exmyth/p/5601288.html

    (1)自定义或者使用spring自带的各种异常处理器

           例如spring基于注解的异常解析器AnnotationHandlerMethodExceptionResolver 、spring自带全局异常处理器SimpleMappingExceptionResolver、自定义实现spring的全局异常解析器HandlerExceptionResolver来处理。

           AnnotationHandlerMethodExceptionResolver目前我所知道的是需要在方法上定义异常的类型,如果异常类型多了,写起代码太麻烦,所以我认为不好用。(那位大侠知道不用定义异常类型就处理所有异常,可以留言告诉我,谢谢!)

           spring自带全局异常处理器SimpleMappingExceptionResolver也是比较繁琐的,需要配置的地方太多了,不喜欢用。

           自定义实现spring的全局异常解析器HandlerExceptionResolver来处理我认为是最方便的,当然,这个是针对我目前的业务场景而言,并不是绝对的。

            由于Java的异常机制,如果发生大量异常,对jvm的性能会产生很大的影响,轻则性能下降10%,重则导致jvm内存溢出,我个人认为能不抛异常就最好不抛,所以,我主要使用自定义实现spring的全局异常解析器HandlerExceptionResolver来处理业务问题。

    (2)自定义实现spring的全局异常解析器HandlerExceptionResolver

           2.1 只需要在spring-mvc的配置文件中定义一个全局异常处理类 

    <!-- 全局异常处理 -->  
    <bean id="exceptionHandler" class="com.aaa.bbb.exception.DefaultExceptionHandler" />  

          2.2  实现HandlerExceptionResolver(第一种实现方式)

                 这种方式需要下载温少写的fastjson,我用的是1.2.6版本,可以百度后自己下载。

    public class DefaultExceptionHandler implements HandlerExceptionResolver {    
        private static Logger log = LoggerFactory.getLogger(DefaultExceptionHandler.class);  
          
        public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,  Exception ex) {    
                ModelAndView mv = new ModelAndView();  
                /*  使用FastJson提供的FastJsonJsonView视图返回,不需要捕获异常   */  
                FastJsonJsonView view = new FastJsonJsonView();  
                Map<String, Object> attributes = new HashMap<String, Object>();  
                attributes.put("code", "1000001");  
                attributes.put("msg", ex.getMessage());  
                view.setAttributesMap(attributes);  
                mv.setView(view);   
                log.debug("异常:" + ex.getMessage(), ex);  
                return mv;  
        }  
    }   

           2.2  实现HandlerExceptionResolver(第二种实现方式)

    public class DefaultExceptionHandler implements HandlerExceptionResolver {    
        private static Logger log = LoggerFactory.getLogger(DefaultExceptionHandler.class);  
          
        public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,  Exception ex) {    
                ModelAndView mv = new ModelAndView();             
                /*  使用response返回    */  
                response.setStatus(HttpStatus.OK.value()); //设置状态码  
                response.setContentType(MediaType.APPLICATION_JSON_VALUE); //设置ContentType  
                response.setCharacterEncoding("UTF-8"); //避免乱码  
                response.setHeader("Cache-Control", "no-cache, must-revalidate");  
                try {  
                    response.getWriter().write("{"success":false,"msg":"" + ex.getMessage() + ""}");  
                } catch (IOException e) {  
                   log.error("与客户端通讯异常:"+ e.getMessage(), e);  
                }  
      
                log.debug("异常:" + ex.getMessage(), ex);  
                return mv;  
        }  
    }  

    到此,spring mvc全局异常处理返回json就搞定了,发生异常后,返回的都是json数据,不会再有烦人的异常内容。不过这还不算完整,需要在web.xml中加入异常代码404或者500的处理才能算完。

    (1)web页面异常处理配置

    <!-- web异常页面处理 -->  
    <error-page>  
        <exception-type>java.lang.Throwable</exception-type>  
        <location>/error_500</location>  
    </error-page>  
    <error-page>  
        <exception-type>java.lang.Exception</exception-type>  
        <location>/error_404</location>  
    </error-page>  
    <error-page>  
        <error-code>500</error-code>  
        <location>/error_500</location>  
    </error-page>  
    <error-page>  
        <error-code>501</error-code>  
        <location>/error_500</location>  
    </error-page>  
    <error-page>  
        <error-code>502</error-code>  
        <location>/error_500</location>  
    </error-page>  
    <error-page>  
        <error-code>404</error-code>  
        <location>/error_404</location>  
    </error-page>  
    <error-page>  
        <error-code>403</error-code>  
        <location>/error_404</location>  
    </error-page>  
    <error-page>  
        <error-code>400</error-code>  
        <location>/error_404</location>  
    </error-page>  

    (2)后台处理

    /** 
     * 请求异常 
     * @return 
     * @throws Exception 
     * String 
     */  
    @RequestMapping(value = "/error_404", produces = "text/html;charset=UTF-8")  
    @ResponseBody  
    public String error_404() throws Exception {   
      return "{"msg":"找不到页面","code":"1000001"}";  
    }  
    /** 
     * 服务器异常 
     * @return 
     * String 
     */  
    @RequestMapping(value ="/error_500", produces = "text/html;charset=UTF-8")  
    public String error_500() {     
      return "{"msg":"服务器处理失败","code":"1000002"}"; }

    最后,基本上所有的异常都能被捕获,能够出现异常时,友好的提示用户端,也能避免服务器端抛异常导致的问题。

  • 相关阅读:
    阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_14-课程预览功能开发-CMS添加页面接口
    阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_13-课程预览功能开发-CMS页面预览接口测试
    阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_12-课程预览功能开发-需求分析
    阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_11-课程详情页面静态化-课程信息模板设计
    阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_10-课程详情页面静态化-课程详情模型数据查询接口
    阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_09-课程详情页面静态化-静态页面测试
    阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_08-课程预览技术方案
    阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_07-Feign远程调用-Feign测试
    阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_06-Feign远程调用-Ribbon测试
    阶段5 3.微服务项目【学成在线】_day09 课程预览 Eureka Feign_05-Feign远程调用-客户端负载均衡介绍
  • 原文地址:https://www.cnblogs.com/jlustone/p/7515521.html
Copyright © 2011-2022 走看看