• 【SpringMVC】JSON数据传输与异常处理的使用


    一、Jackson

    1.1 Jackson是什么

    在Java中,Jackson是一个流行的开源库,用于处理JSON数据。它提供了一组功能强大的API,可以将Java对象序列化为JSON格式,或将JSON数据反序列化为Java对象。Jackson库提供了灵活的方式来处理JSON数据,包括读取、写入、转换和操作JSON对象。它是Java开发人员在处理JSON数据时的常用工具之一。

    1.2 常用注解

    Jackson库提供了一些常用的注解,用于在Java对象和JSON数据之间进行序列化和反序列化的映射。以下是一些常用的Jackson注解:

    1. @JsonProperty:用于指定Java对象属性与JSON字段之间的映射关系
    2. @JsonFormat:用于指定日期、时间等特殊类型属性的格式化方式。
    3. @JsonIgnore:用于忽略某个属性,不进行序列化和反序列化。 @JsonInclude:用于控制在序列化过程中是否包含某个属性。
    4. @JsonAlias:用于指定多个JSON字段名与Java对象属性之间的映射关系。
    5. @JsonCreator:用于指定一个静态工厂方法或构造函数,用于反序列化JSON数据。
    6. @JsonAnyGetter和@JsonAnySetter:用于处理动态属性,允许将未映射到Java对象属性的JSON字段读取和写入。

    1.3 实例

    1.3.1导入依赖

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

    1.3.2 配置spring-mvc.xml

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

    1.3.3 JsonController.java

    @RequestMapping("/queryListBooks")
        @ResponseBody
        public List<Book> queryListBooks(Book book,HttpServletRequest request){
            PageBean pageBean=new PageBean();
            pageBean.setRequest(request);
            List<Book> books = bookService.queryBookPager(book, pageBean);
            return   books;
        };
    @RequestMapping("/querySingleBook")
        @ResponseBody
        public Book querySingleBook(Integer bookId){
            Book book = bookService.selectByPrimaryKey(bookId);
            book.setDate(new Date());
            return book;
        }
     @RequestMapping("/querySingleMap")
        @ResponseBody
        public Map<String, Object> querySingleMap(Integer bookId){
            return  bookService.querySingleMap(bookId);
        }
    @RequestMapping("/queryMapList")
        @ResponseBody
        public List<Map<String, Object>> queryMapList( ){
               return bookService.queryBookAll();
        }
    @RequestMapping("/queryString")
        @ResponseBody
        public String queryString(){
            return "book/bookList";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    二、Spring MVC异常处理机制

    2.1 使用原因

    我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是(dao/mapper)层、service层还是controller层,都有可能抛出异常。

    而在Spring MVC中提供了一个通用的异常处理机制,它提供了一个成熟、简洁并且清晰的异常处理方案。当使用Spring MVC开发Web应用时,利用这套现成的机制进行异常处理也更加自然并且高效。

    2.2 SpringMVC异常处理

    2.2.1 异常处理机制流程图

    系统的Dao(mapper)、Service、Controller出现都通过throws Exception向上抛出,最后SpringMVC前端控制器交由异常处理器进行异常处理,如下图:
    在这里插入图片描述

    2.2.2 异常处理的三种方式

    1. 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;

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

    (1)配置SpringMVC的简单的异常处理器

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

    (2)方法中抛出此异常

    @RequestMapping("/querySingleBook")
        @ResponseBody
        public Book querySingleBook(Integer bookId){
            Book book = bookService.selectByPrimaryKey(bookId);
            if(bookId>100)
                throw new RuntimeException("书本编号大于100,异常抛出!!!");
            book.setDate(new Date());
            return book;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2. 实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器;
    (1) 实现HandlerExceptionResolver接口

    package com.xqx.exception;
     
    import org.springframework.stereotype.Component;
    import org.springframework.web.servlet.HandlerExceptionResolver;
    import org.springframework.web.servlet.ModelAndView;
     
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    /**
     * SpingMVC提供的第二种全局异常处理方式  ,实现HandlerExceptionResolver接口
     */
    @Component
    public class GlobalException implements HandlerExceptionResolver {
        /**
         *
         * @param httpServletRequest
         * @param httpServletResponse
         * @param o 异常处理的目标
         * @param e 异常处理的类型
         * @return
         */
        @Override
        public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
            ModelAndView mv=new ModelAndView();
            mv.setViewName("error");
            //判断异常的分类
            if(e instanceof RuntimeException){
                    RuntimeException ex=(RuntimeException)e;
                    System.out.println(ex.getMessage());
                    mv.addObject("msg",ex.getMessage());
            }
            return mv;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    (2)创建异常类

    package com.xqx.exception;
     
    import org.springframework.stereotype.Component;
    import org.springframework.web.servlet.HandlerExceptionResolver;
    import org.springframework.web.servlet.ModelAndView;
     
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
     
    /**
     * SpingMVC提供的第二种全局异常处理方式  ,实现HandlerExceptionResolver接口
     */
    @Component
    public class GlobalException implements HandlerExceptionResolver {
        /**
         *
         * @param httpServletRequest
         * @param httpServletResponse
         * @param o 异常处理的目标
         * @param e 异常处理的类型
         * @return
         */
        @Override
        public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
            ModelAndView mv=new ModelAndView();
            mv.setViewName("error");
            //判断异常的分类
            if(e instanceof RuntimeException){
                    RuntimeException ex=(RuntimeException)e;
                    System.out.println(ex.getMessage());
                    mv.addObject("msg",ex.getMessage());
            }
            return mv;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    (3)方法中抛出此异常

    @RequestMapping("/querySingleBook")
        @ResponseBody
        public Book querySingleBook(Integer bookId){
            Book book = bookService.selectByPrimaryKey(bookId);
            if(bookId>100)
                throw new BusinessException("书本编号大于100,异常抛出!!!");
            book.setDate(new Date());
            return book;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3. 使用@ControllerAdvice + @ExceptionHandler

    (1)

    package com.xqx.exception;
    
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.RestControllerAdvice;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
     
    import java.util.HashMap;
    import java.util.Map;
     
     
    /**
     * SpingMVC提供的第三种种全局异常处理方式
     * 1)@ControllerAdvice +@ExceptionHandler
     * 2)@RestControllerAdvice +@ExceptionHandler
     *      @RestControllerAdvice ==@Controller +@ResponseBody 返回JSON的数据格式,绕开视图解析器
     */
    @ControllerAdvice
    public class GlobalException2{
            @ExceptionHandler
            public ModelAndView exceptionHandler(Exception e){
                ModelAndView mv=new ModelAndView();
                //设置错误页面
                mv.setViewName("error");
                //判断异常类型
                if(e instanceof BusinessException){
                BusinessException ex=(BusinessException)e;
                    mv.addObject("msg","系统繁忙,请稍后再试.......");
                }
     
                mv.setView(new MappingJackson2JsonView());
                return mv;
            }
     
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    (2) 返回JSON格式

    package com.xqx.exception;
     
     
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.RestControllerAdvice;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
     
    import java.util.HashMap;
    import java.util.Map;
     
     
    /**
     * SpingMVC提供的第三种种全局异常处理方式
     * 1)@ControllerAdvice +@ExceptionHandler
     * 2)@RestControllerAdvice +@ExceptionHandler
     *      @RestControllerAdvice ==@Controller +@ResponseBody 返回JSON的数据格式,绕开视图解析器
     */
    @RestControllerAdvice
    public class GlobalException2{
            @ExceptionHandler
            public ModelAndView exceptionHandler(Exception e){
                ModelAndView mv=new ModelAndView();
                mv.setViewName("error");
                //判断异常类型
                if(e instanceof BusinessException){
                BusinessException ex=(BusinessException)e;
                    mv.addObject("msg","系统繁忙,请稍后再试.......");
                }
     
                //强制更换视图解析器  不跳页面!!!
                mv.setView(new MappingJackson2JsonView());
                return mv;
            }
     
           
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    (3) 返回异常信息和状态码

    package com.xqx.exception;
     
     
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.RestControllerAdvice;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
     
    import java.util.HashMap;
    import java.util.Map;
     
     
    /**
     * SpingMVC提供的第三种种全局异常处理方式
     * 1)@ControllerAdvice +@ExceptionHandler
     * 2)@RestControllerAdvice +@ExceptionHandler
     *      @RestControllerAdvice ==@Controller +@ResponseBody 返回JSON的数据格式,绕开视图解析器
     */
    @RestControllerAdvice
    public class GlobalException2{
     
            @ExceptionHandler
            public Map<String, Object> exceptionHandler(Exception e){
                Map<String, Object> json=new HashMap();
                //判断异常类型
                if(e instanceof BusinessException){
                    json.put("msg","系统繁忙,请稍后再试.......");
                    json.put("code",500);
                }
     
                return json;
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
  • 相关阅读:
    爱普生机器人修改IP
    【进程间通信】进程间通信方式汇总
    GET,POST,DELETE,PUT参数传递的形式
    RecyclerView 数据更新方法 notifyItemChanged/notifyItemInsert/notifyIteRemoved
    Spring面试题23:Spring支持哪些事务管理类型?Spring框架的事务管理有哪些优点?你更倾向用哪种事务管理类型?
    .NET8 AOT和JIT的性能,谁更高呢?
    Hexagon_V65_Programmers_Reference_Manual(22)
    Android---GC回收机制与分代回收策略
    如何查看dnSpy反编译异步代码
    DEJA_VU3D - Cesium功能集 之 069-空间坐标系之包围圆
  • 原文地址:https://blog.csdn.net/TestXzing/article/details/132866539