• Springmvc ---- json解析和异常处理


    目录

    一、json解析

    1. JOSN的各种场景

     二、异常处理

     1)SpringMVC自带的简单异常处理器

     2)通过HandlerExceptionResovler接口实现全局异常

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

     4)全局异常处理JSON返回


    一、json解析

     SpringMVC框架如何产生下面三种格式的数据?(对象,数组,对象数组)

    1.导入pom.xml依赖

    2.配置Springmvc.xml配置适配器

    作用是做json数据转换

    3.使用注解能够将任何的数据转换成json对象

    1. JOSN的各种场景

    操作步骤:

    1.导入依赖:

    1. <dependency>
    2. <groupId>com.fasterxml.jackson.core</groupId>
    3. <artifactId>jackson-databind</artifactId>
    4. <version>2.9.3</version>
    5. </dependency>
    6. <dependency>
    7. <groupId>com.fasterxml.jackson.core</groupId>
    8. <artifactId>jackson-core</artifactId>
    9. <version>2.9.3</version>
    10. </dependency>
    11. <dependency>
    12. <groupId>com.fasterxml.jackson.core</groupId>
    13. <artifactId>jackson-annotations</artifactId>
    14. <version>2.9.3</version>
    15. </dependency>

    2.添加适配器:(固定代码)

    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. <!--处理中文乱码以及避免IE执行AJAX时,返回JSON出现下载文件-->
    11. <property name="supportedMediaTypes">
    12. <list>
    13. <value>text/html;charset=UTF-8</value>
    14. <value>text/json;charset=UTF-8</value>
    15. <value>application/json;charset=UTF-8</value>
    16. </list>
    17. </property>
    18. </bean>

    3.创建处理器类controller类

    1. package com.zking.oa.controller;
    2. import org.springframework.stereotype.Controller;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. import org.springframework.web.bind.annotation.ResponseBody;
    5. /**
    6. * @author 锦鲤
    7. * @site www.lucy.com
    8. * @company xxx公司
    9. * @create  2022-08-22 16:36
    10. */
    11. @Controller
    12. @RequestMapping("/clz/json")
    13. public class JsonController {
    14. @ResponseBody
    15. @RequestMapping("/clzEdit")
    16. public String clzEdit(){
    17. System.out.println("JsonController.clzEdit");
    18. return "clzEdit";
    19. }
    20. }

    其他代码配置‘

    接口类

    package com.zking.oa.biz;
    
    import com.zking.oa.model.Clazz;
    import com.zking.oa.util.PageBean;
    
    import java.util.List;
    import java.util.Map;
    
    /**
     * @author 锦鲤
     * @site www.lucy.com
     * @company xxx公司
     * @create  2022-08-18 13:08
     */
    public interface ClazzBiz {
        int deleteByPrimaryKey(Integer cid);
    
        int insert(Clazz record);
    
        int insertSelective(Clazz record);
    
        Clazz selectByPrimaryKey(Integer cid);
    
        int updateByPrimaryKeySelective(Clazz record);
    
        int updateByPrimaryKey(Clazz record);
    
            List listPager (Clazz clazz, PageBean pagebean);
            List listMapPaper(Clazz clazz,PageBean pagebean );
    
    
     }
    

     clazzmapper.java

    package com.zking.oa.mapper;
    
    import com.zking.oa.model.Clazz;
    import com.zking.oa.util.PageBean;
    import org.springframework.stereotype.Repository;
    
    import java.util.List;
    import java.util.Map;
    
    @Repository
    public interface ClazzMapper {
        int deleteByPrimaryKey(Integer cid);
    
        int insert(Clazz record);
    
        int insertSelective(Clazz record);
    
        Clazz selectByPrimaryKey(Integer cid);
    
        int updateByPrimaryKeySelective(Clazz record);
    
        int updateByPrimaryKey(Clazz record);
        //分页
        List listPager (Clazz clazz);
        List listMapPaper(Clazz clazz );
    
    }

     clazzmapper.xml配置

     实现类

    package com.zking.oa.biz;
    
    import com.zking.oa.mapper.ClazzMapper;
    import com.zking.oa.model.Clazz;
    import com.zking.oa.util.PageBean;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    import java.util.Map;
    
    /**
     * @author 锦鲤
     * @site www.lucy.com
     * @company xxx公司
     * @create  2022-08-18 13:08
     */
    @Service
    public class ClazzbizImpl implements  ClazzBiz {
            @Autowired
            private ClazzMapper clazzmapper;
    
        @Override
        public int deleteByPrimaryKey(Integer cid) {
                return clazzmapper.deleteByPrimaryKey(cid);
        }
    
        @Override
        public int insert(Clazz record) {
            return clazzmapper.insert(record);
        }
    
        @Override
        public int insertSelective(Clazz record) {
            return clazzmapper.insertSelective(record);
        }
    
        @Override
        public Clazz selectByPrimaryKey(Integer cid) {
            return clazzmapper.selectByPrimaryKey(cid);
        }
    
        @Override
        public int updateByPrimaryKeySelective(Clazz record) {
            return clazzmapper.updateByPrimaryKeySelective(record);
        }
    
        @Override
        public int updateByPrimaryKey(Clazz record) {
            return clazzmapper.updateByPrimaryKey(record);
        }
    
        @Override
        public List listPager(Clazz clazz, PageBean pagebean) {
            return  clazzmapper.listPager(clazz);
        }
    
    
        @Override
        public List listMapPaper(Clazz clazz, PageBean pagebean) {
            return clazzmapper.listMapPaper(clazz);
        }
    }
    

     

    1.1.1返回List

    1. // list
    2. @ResponseBody
    3. @RequestMapping("/list")
    4. public List<Clazz> list(HttpServletRequest request, Clazz clazz) {
    5. PageBean pagebean = new PageBean();
    6. pagebean.setRequest(request);
    7. //结果[{},{}]
    8. return this.clazzBiz.listPager(clazz, pagebean);
    9. }

    1.1.2返回List

    1. // list
    2. @ResponseBody
    3. @RequestMapping("/listMap")
    4. public List<Map> listMap(HttpServletRequest request, Clazz clazz) {
    5. PageBean pagebean = new PageBean();
    6. pagebean.setRequest(request);
    7. //结果{},{}
    8. return this.clazzBiz.listMapPaper(clazz, pagebean);
    9. }

    1.1.3返回T

    1. // T
    2. @ResponseBody
    3. @RequestMapping("/load")
    4. public Clazz load(HttpServletRequest request, Clazz clazz) {
    5. PageBean pagebean = new PageBean();
    6. pagebean.setRequest(request);
    7. return this.clazzBiz.listPager(clazz, pagebean).get(0);
    8. }

    1.1.4返回Map

    1. // map
    2. @ResponseBody
    3. @RequestMapping("/map")
    4. public Map map(HttpServletRequest request, Clazz clazz) {
    5. PageBean pagebean = new PageBean();
    6. pagebean.setRequest(request);
    7. //结果{}
    8. return this.clazzBiz.listMapPaper(clazz, pagebean).get(0);
    9. }

    1.1.5返回混合

    1. // 格式 {
    2. // msg:"",
    3. // data:[],
    4. // pagebean:{}
    5. // }
    6. @ResponseBody
    7. @RequestMapping("/hunhe")
    8. public Map hunhe(HttpServletRequest request, Clazz clazz) {
    9. //http://loclhost:8080/clz/json/load?cid=2
    10. PageBean pagebean = new PageBean();
    11. pagebean.setRequest(request);
    12. List<Clazz> lst = this.clazzBiz.listPager(clazz, pagebean);
    13. Map map = new HashMap();
    14. map.put("data", lst);
    15. map.put("pagebean", pagebean);
    16. return map;
    17. }


     二、异常处理

     背景:

    在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。

    异常处理的三种方式

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

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

       3)使用@ControllerAdvice + @ExceptionHandler

     

     jsonController类

    1. // list<T> // list<T> 异常处理
    2. @ResponseBody
    3. @RequestMapping("/list")
    4. public List<Clazz> list(HttpServletRequest request, Clazz clazz) {
    5. PageBean pagebean = new PageBean();
    6. pagebean.setRequest(request);
    7. //结果[{},{}]
    8. if(true){
    9. throw new RuntimeException("查询班级异常,异常存在于jsonController.xml里");
    10. }
    11. return this.clazzBiz.listPager(clazz, pagebean);
    12. }

     实现类

    1. @Override
    2. public List<Map> listMapPaper(Clazz clazz, PageBean pagebean) {
    3. if(true){
    4. throw new RuntimeException("错误出现在 ClazzBizImpl.ListapPager...里");
    5. }
    6. return clazzmapper.listMapPaper(clazz);
    7. }

    1)SpringMVC自带的简单异常处理器

    package com.zking.oa.Excetion;
    
    import org.springframework.stereotype.Component;
    import org.springframework.web.servlet.HandlerExceptionResolver;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.annotation.Resource;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * @author 锦鲤
     * @site www.lucy.com
     * @company xxx公司
     * @create  2022-08-22 19:49
     */
    //第三个方法则注掉
    @Component
    public class GlobalhandlerExcetionResovler  implements HandlerExceptionResolver {
    
    
        @Override
        public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
    
            ModelAndView mv=new ModelAndView();
            mv.setViewName("error");
            if( e instanceof  GlobalException){
                GlobalException exception=(GlobalException)e;
                mv.addObject("ex",exception.getMessage());
                mv.addObject("msg","全局异常,错误代码506");
    
            }
            else if( e instanceof  RuntimeException){
                RuntimeException exception=(RuntimeException)e;
                mv.addObject("ex",exception.getMessage());
                mv.addObject("msg","运行时异常,错误代码606");
    
            }
    
            return mv;
        }
    }
    

     

    <%--
      Created by IntelliJ IDEA.
      User: Administrator
      Date: 2022/8/22
      Time: 18:56
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        错误信息页面
    
    
            ${ex}
        
    
    
    
    
    

     

     

     

     2)通过HandlerExceptionResovler接口实现全局异常

    1. package com.zking.oa.Excetion;
    2. /**
    3. * @author 锦鲤
    4. * @site www.lucy.com
    5. * @company xxx公司
    6. * @create  2022-08-22 16:36
    7. */
    8. public class GlobalException extends RuntimeException {
    9. public GlobalException() {
    10. }
    11. public GlobalException(String message) {
    12. super(message);
    13. }
    14. public GlobalException(String message, Throwable cause) {
    15. super(message, cause);
    16. }
    17. public GlobalException(Throwable cause) {
    18. super(cause);
    19. }
    20. public GlobalException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
    21. super(message, cause, enableSuppression, writableStackTrace);
    22. }
    23. }

     

    异常处理器 GlobalExceptionHandler

    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. ModelAndView mv = new ModelAndView();
    8. mv.setViewName("error");
    9. if (e instanceof GlobalException){
    10. GlobalException globalException = (GlobalException) e;
    11. mv.addObject("ex",globalException.getMessage());
    12. mv.addObject("msg","全局异常....");
    13. }else if (e instanceof RuntimeException){
    14. RuntimeException runtimeException = (RuntimeException) e;
    15. mv.addObject("ex",runtimeException.getMessage());
    16. mv.addObject("msg","运行时异常....");
    17. }
    18. return mv;
    19. }
    20. }

    测试代码controller层的改变

     @ResponseBody

     

        @RequestMapping("/load")

        public Clazz load(HttpServletRequest req, Clazz clazz){

            if(clazz.getCid() != null){

                List lst = this.clazzBiz.listPager(clazz, null);

                if (true)

                    throw new GlobalException("错误出现在 JsonController.load...");

                return lst.get(0);

            }

            return null;

        }

     

     

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

    1. @ControllerAdvice
    2. public class GlobalExceptionResolver {
    3. @ExceptionHandler
    4. public ModelAndView handler(Exception e){
    5. ModelAndView mv = new ModelAndView();
    6. mv.setViewName("error");
    7. if (e instanceof GlobalException){
    8. GlobalException globalException = (GlobalException) e;
    9. mv.addObject("ex",globalException.getMessage());
    10. mv.addObject("msg","全局异常....");
    11. }else if (e instanceof RuntimeException){
    12. RuntimeException runtimeException = (RuntimeException) e;
    13. mv.addObject("ex",runtimeException.getMessage());
    14. mv.addObject("msg","运行时异常....");
    15. }
    16. return mv;
    17. }
    18. }

     

     4)全局异常处理JSON返回

    1. package com.zking.oa.Excetion;
    2. import org.springframework.stereotype.Component;
    3. import org.springframework.web.bind.annotation.ControllerAdvice;
    4. import org.springframework.web.bind.annotation.ExceptionHandler;
    5. import org.springframework.web.servlet.HandlerExceptionResolver;
    6. import org.springframework.web.servlet.ModelAndView;
    7. import javax.servlet.http.HttpServletRequest;
    8. import javax.servlet.http.HttpServletResponse;
    9. /**
    10. * @author 锦鲤
    11. * @site www.lucy.com
    12. * @company xxx公司
    13. * @create  2022-08-22 19:10
    14. * 处理全局异常的解析器
    15. */
    16. @ControllerAdvice
    17. public class GlobalExceptionResolver implements HandlerExceptionResolver {
    18. /**
    19. *
    20. * @param httpServletRequest
    21. * @param httpServletResponse
    22. * @param o 目标对象
    23. * @param e 目标对象执行出现的异常
    24. * @return
    25. */
    26. @ExceptionHandler
    27. @Override
    28. public ModelAndView resolveException(HttpServletRequest httpServletRequest,
    29. HttpServletResponse httpServletResponse,
    30. Object o, Exception e) {
    31. ModelAndView mv=new ModelAndView();
    32. mv.setViewName("error");
    33. if(e instanceof GlobalException){
    34. GlobalException GlobalExcetion = (GlobalException) e;
    35. mv.addObject("ex",GlobalExcetion.getMessage());
    36. mv.addObject("msg","全局异常,错误代码503");
    37. }
    38. else if (e instanceof RuntimeException){
    39. RuntimeException runtimeException = (RuntimeException) e;
    40. mv.addObject("ex",runtimeException.getMessage());
    41. mv.addObject("msg","全局异常,错误代码503");
    42. }
    43. return mv;
    44. }
    45. }

     

    效果图:

     

     

     


  • 相关阅读:
    【UniApp】-uni-app-打包成网页
    Java 多线程(五):锁(三)
    用立方样条联合SHAP分析在危险因素鉴定中的作用
    Echarts图表中formatter的用法
    多线程之Semaphore原理
    安装及管理文件
    五款最热低代码平台推荐!
    Unix后记&寻找Shen Lin
    Yii使用queue实现队列
    【思维】如何放下心中的执念?
  • 原文地址:https://blog.csdn.net/qq_66924116/article/details/126468589