JSON和全局异常处理

简介: 我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。
  1. 添加jackson相关依赖

    com.fasterxml.jackson.core
    jackson-databind
    2.9.3


    com.fasterxml.jackson.core
    jackson-core
    2.9.3


    com.fasterxml.jackson.core
    jackson-annotations
    2.9.3
  2. 在springmvc-servlet.xml的mvc:annotation-driven标签下添加如下内容

     <property name="messageConverters">
         <list>
             <ref bean="mappingJackson2HttpMessageConverter"/>
         </list>
     </property>


    <bean id="mappingJackson2HttpMessageConverter"

       class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
     <!--处理中文乱码以及避免IE执行AJAX时,返回JSON出现下载文件-->
     <property name="supportedMediaTypes">
         <list>
             <value>text/html;charset=UTF-8</value>
             <value>text/json;charset=UTF-8</value>
             <value>application/json;charset=UTF-8</value>
         </list>
     </property>

  3. 在请求处理方法中添加@ResponseBody注解,将返回结果直接转换成JSON
    @RequestMapping("/loadFwxxToJson")
    @ResponseBody
    public Fwxx loadFwxxToJson(@ModelAttribute Fwxx fwxx) {
    ...
    }

    注:此请求处理方法返回的已经不是视图了

// 1.对象 {}
// 2.集合 [{},{}]
// 3.混合模式 {code:200,msg:'登录成功',data:[{},{}]}

  1. 解决JSON死循环问题
    @JsonIgnore
  2. 解决JSON格式化问题
    JsonFormat
    日期格式化
    数字格式化(使用较少)

全局异常处理

1.为什么要全局异常处理

我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。

2.异常处理思路

参考images中的《springmvc全局异常处理思路.png》

系统的dao、service、controller出现异常都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理。springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。

3.SpringMVC全局异常处理的三种方式

1)使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;
2)实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器;
3)使用@ControllerAdvice + @ExceptionHandler

4.综合案例

4.1 SpringMVC自带的简单异常处理器

SpringMVC中自带了一个异常处理器叫SimpleMappingExceptionResolver,该处理器实现了HandlerExceptionResolver 接口,全局异常处理器都需要实现该接口

   <!-- 定义默认的异常处理页面 -->
   <property name="defaultErrorView" value="error"/>
   <!-- 定义异常处理页面用来获取异常信息的变量名,也可不定义,默认名为exception --> 
   <property name="exceptionAttribute" value="ex"/>
   <!-- 定义需要特殊处理的异常,这是重要点 --> 
   <property name="exceptionMappings">
       <props>
           <prop key="java.lang.RuntimeException">error</prop>
       </props>
       <!-- 还可以定义其他的自定义异常 -->
   </property>

注:页面跳转由SpringMVC来接管了,所以此处的定义默认的异常处理页面都应该配置成逻辑视图名。

4.2 通过HandlerExceptionResovler接口实现全局异常

@Component
public class GlobalExceptionHandler implements HandlerExceptionResolver {

  @Override
  public ModelAndView resolveException(HttpServletRequest httpServletRequest,
                                     HttpServletResponse httpServletResponse,
                                     Object o, Exception e) {
      ...
  }

}

注:
1)通过instanceof判断异常类型
2)通过设置mv.setView(new MappingJackson2JsonView())方式返回JSON数据;

4.3 使用@ControllerAdvice+@ExceptionHandler实现全局异常

@ControllerAdvice
public class GlobalExceptionResolver {

 @ExceptionHandler(value=RuntimeException.class)
 public ModelAndView handler(Exception e){
    ...
 }

}

4.4 响应封装类

  4.4.1 创建自定义异常类BusinessException

  BusinessException自定义异常类将继承RuntimeException异常,该异常类用于处理在程序代码运行过程所产生的运行时业务异常信息。

  4.4.2 创建响应枚举类JsonResponseStatus

  JsonResponseStatus响应枚举类用于自定义错误码。

  4.4.3 创建响应封装类JsonResponseBody

  JsonResponseBody响应封装类用于以JSON的形式统一输出错误信息。

案例1:SpringMVC自带的简单异常处理器
案例2:HandlerExceptionResovler接口实现全局异常
案例3:@ControllerAdvice+@ExceptionHandler实现全局异常
案例4:全局异常+响应封装类

  示例1:在pom配置中不导入mysql的jar包,在mapper中的方法中throws Exception异常,再在全局异常中接收Exception类型异常并处理
  示例2:所有services接口及实现类中的方法返回JsonResponseBody类型,并在其中处理业务抛出BusinessException业务异常
  实例3:在Controller层中的方法中直接抛出BusinessException业务异常

附录一:?、T、K、V、E的区别?
? 表示不确定的java类型
T (type) 表示具体的一个java类型
K V (key value) 分别代表java键值中的Key Value
E (element) 代表Element

使用大写字母A,B,C,D......X,Y,Z定义的,就都是泛型,把T换成A也一样,这里T只是名字上的意义而已。

  1. 转换时指定属性名
    @JsonProperty("error_code")
相关文章
|
10月前
|
JSON 前端开发 Java
JSON注解和异常处理的使用
JSON注解和异常处理的使用
126 0
|
12月前
|
JSON 监控 Java
【SpringMVC】JSON数据返回及异常处理
Jackson是一个用于Java对象和JSON数据之间相互转换的开源库。它提供了一组强大的API,可以将Java对象序列化为JSON格式的字符串,也可以将JSON字符串反序列化为Java对象。Jackson库由三个核心模块组成::用于将Java对象与JSON数据进行绑定(序列化和反序列化)。它提供了一系列注解,如等,用于指定对象属性与JSON字段之间的映射关系,以及日期、时间等特殊类型的处理方式。Databind模块也提供了一些高级特性,如多态类型处理、双向引用处理等。
|
11月前
|
JSON 前端开发 Java
构建健壮的Spring MVC应用:JSON响应与异常处理
构建健壮的Spring MVC应用:JSON响应与异常处理
49 0
|
4月前
|
XML JSON JavaScript
JSON和全局异常处理
JSON和全局异常处理
65 0
|
9月前
|
JSON 前端开发 Java
SpringMVC之JSON返回及异常处理
SpringMVC之JSON返回及异常处理
94 0
|
9月前
|
JSON 前端开发 Java
【SpringMVC】JSON数据传输与异常处理的使用
【SpringMVC】JSON数据传输与异常处理的使用
66 0
|
11月前
|
XML JSON 前端开发
一篇博文教你SpringMVC中JSON注解&异常处理的使用
一篇博文教你SpringMVC中JSON注解&异常处理的使用
105 0
|
11月前
|
JSON 前端开发 Java
【SpringMVC】JSON注解&异常处理的使用
【SpringMVC】JSON注解&异常处理的使用
60 0
|
JSON 前端开发 Java
SpringMVC04之JSON和全局异常处理
SpringMVC04之JSON和全局异常处理
SpringMVC04之JSON和全局异常处理
|
JSON 前端开发 Java
【Spring MVC】(四)Spring MVC响应视图(字符串的方式、ModelAndView 对象、JSON 数据)、统一异常处理(普通请求、AJAX 请求)
【Spring MVC】(四)Spring MVC响应视图(字符串的方式、ModelAndView 对象、JSON 数据)、统一异常处理(普通请求、AJAX 请求)
474 0
【Spring MVC】(四)Spring MVC响应视图(字符串的方式、ModelAndView 对象、JSON 数据)、统一异常处理(普通请求、AJAX 请求)