• SpringMVC04之JSON和全局异常处理


    14天阅读挑战赛
    努力是为了不平庸~

    目录

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

    2.异常处理思路

    3.SpringMVC异常分类

    4.综合案例

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

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

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

            4.4 响应封装类

    1. 添加jackson相关依赖

    2. 在springmvc-servlet.xml的mvc:annotation-driven标签下添加如下内容

    3. 在请求处理方法中添加@ResponseBody注解,将返回结果直接转换成JSON

    4. 解决JSON死循环问题:@JsonIgnore

    5. 解决JSON格式化问题

    6. 转换时指定属性名:@JsonProperty("error_code")


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

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

    2.异常处理思路

     系统的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 接口,全局异常处理器都需要实现该接口

    1. <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    2. <property name="defaultErrorView" value="error"/>
    3. <property name="exceptionAttribute" value="ex"/>
    4. <property name="exceptionMappings">
    5. <props>
    6. <prop key="java.lang.RuntimeException">errorprop>
    7. props>
    8. property>
    9. bean>

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

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

    1. @Component
    2. public class GlobalExceptionHandler implements HandlerExceptionResolver {
    3. @Override
    4. public ModelAndView resolveException(HttpServletRequest httpServletRequest,
    5. HttpServletResponse httpServletResponse,
    6. Object o, Exception e) {
    7. ...
    8. }
    9. }

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

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

    1. @ControllerAdvice
    2. public class GlobalExceptionResolver {
    3. @ExceptionHandler(value=RuntimeException.class)
    4. public ModelAndView handler(Exception e){
    5. ...
    6. }
    7. }

            4.4 响应封装类

                    4.4.1 创建自定义异常类BusinessException

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

                    4.4.2 创建响应枚举类JsonResponseStatus

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

                    4.4.3 创建响应封装类JsonResponseBody

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

    1. 添加jackson相关依赖

    1. <dependency>
    2. <groupId>com.fasterxml.jackson.coregroupId>
    3. <artifactId>jackson-databindartifactId>
    4. <version>2.9.3version>
    5. dependency>
    6. <dependency>
    7. <groupId>com.fasterxml.jackson.coregroupId>
    8. <artifactId>jackson-coreartifactId>
    9. <version>2.9.3version>
    10. dependency>
    11. <dependency>
    12. <groupId>com.fasterxml.jackson.coregroupId>
    13. <artifactId>jackson-annotationsartifactId>
    14. <version>2.9.3version>
    15. dependency>

    2. 在springmvc-servlet.xml的mvc:annotation-driven标签下添加如下内容

    1. <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    2. <property name="messageConverters">
    3. <list>
    4. <ref bean="mappingJackson2HttpMessageConverter"/>
    5. list>
    6. property>
    7. bean>
    8. <bean id="mappingJackson2HttpMessageConverter"
    9. class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    10. <property name="supportedMediaTypes">
    11. <list>
    12. <value>text/html;charset=UTF-8value>
    13. <value>text/json;charset=UTF-8value>
    14. <value>application/json;charset=UTF-8value>
    15. list>
    16. property>
    17. bean>

    3. 在请求处理方法中添加@ResponseBody注解,将返回结果直接转换成JSON

    1. @RequestMapping("/loadFwxxToJson")
    2. @ResponseBody
    3. public Fwxx loadFwxxToJson(@ModelAttribute Fwxx fwxx) {
    4. ...
    5. }

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

    4. 解决JSON死循环问题:@JsonIgnore

    5. 解决JSON格式化问题

    JsonFormat
    日期格式化
    数字格式化(使用较少)

    6. 转换时指定属性名:@JsonProperty("error_code")

    以上就是今天的分享了!!!

  • 相关阅读:
    vue3 封装千分位分隔符自定义指令
    高教社杯数模竞赛特辑论文篇-2023年C题:基于历史数据的蔬菜类商品定价与补货决策模型(附获奖论文及R语言和Python代码实现)
    隐私计算迎来“开源革命”,高质量项目有哪些?
    Java入门基础第9天Java eclipse如何调试代码
    JVM如何卸载一个类
    EN 671-1固定式消防系统软管—CE认证
    李沐63_束搜索——自学笔记
    JS-sort
    Spring Cloud Circuit Breaker 使用示例
    springboot和spring对比
  • 原文地址:https://blog.csdn.net/m0_62246061/article/details/127256039