• 希望你永远不懂JSON和全局异常处理


    目录

            一,json解析

            二,全局异常处理的3种形式

            三,json统一处理


    一,json解析

    json的形式:

    {}->json对象    T Map
    []-> json数组    List  List
    {
        msg:"";
        code:200,        ->json 混合对象
        data:[]
    }

    得到上述三种json形式的数据的方法:

    1,导入pom依赖 jackson(让SpringMVC支持json数据转换)

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

    2.在SpringMVC.xml中配置适配器(做json数据转换)

    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对象

    在Biz层中写出以下几个方法:

    1.返回List

    2.返回List

    3.返回T

    4.返回Map

    5.返回混合

    ClazzBiz:

    1. package com.ljj.ssm.biz;
    2. import com.ljj.model.Clazz;
    3. import com.ljj.ssm.util.PageBean;
    4. import java.util.List;
    5. import java.util.Map;
    6. public interface ClazzBiz {
    7. int deleteByPrimaryKey(Integer cid);
    8. int insert(Clazz record);
    9. int insertSelective(Clazz record);
    10. Clazz selectByPrimaryKey(Integer cid);
    11. int updateByPrimaryKeySelective(Clazz record);
    12. int updateByPrimaryKey(Clazz record);
    13. List listPager(Clazz clazz, PageBean pageBean);
    14. List listMapPager(Clazz clazz, PageBean pageBean);
    15. }

    在ClazzBIzImpl中添加方法:

    1. @Override
    2. public List listMapPager(Clazz clazz, PageBean pageBean) {
    3. return clazzMapper.listMapPager(clazz);
    4. }

    ClazzMapper:

    List <Map> listMapPager(Clazz clazz);

    ClazzMapper.xml:

    JsonController :

    1. package com.ljj.controller;
    2. import com.ljj.model.Clazz;
    3. import com.ljj.ssm.biz.ClazzBiz;
    4. import com.ljj.ssm.util.PageBean;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.web.bind.annotation.RequestMapping;
    7. import org.springframework.web.bind.annotation.RestController;
    8. import javax.servlet.http.HttpServletRequest;
    9. import java.util.HashMap;
    10. import java.util.List;
    11. import java.util.Map;
    12. //@ResponseBody+@Controller=@RestController
    13. @RestController
    14. @RequestMapping("/clz/json")
    15. public class JsonController {
    16. @Autowired
    17. private ClazzBiz clazzBiz;
    18. @RequestMapping("/clzEdit")
    19. public String clzEdit(){
    20. System.out.println("JsonController.clzEdit");
    21. return "clzEdit";
    22. }
    23. /**
    24. * list
    25. */
    26. @RequestMapping("/list")
    27. public List<Clazz> list(HttpServletRequest request, Clazz clazz){
    28. PageBean pageBean=new PageBean();
    29. pageBean.setRequest(request);
    30. // [{},{}]
    31. return this.clazzBiz.listPager(clazz,pageBean);
    32. }
    33. /**
    34. * list
    35. */
    36. @RequestMapping("/listMap")
    37. public List<Map> listMap(HttpServletRequest request, Clazz clazz){
    38. PageBean pageBean=new PageBean();
    39. pageBean.setRequest(request);
    40. // [{},{}]
    41. return this.clazzBiz.listMapPager(clazz,pageBean);
    42. }
    43. // 返回单个Map集合
    44. @RequestMapping("/map")
    45. public Map map(HttpServletRequest request, Clazz clazz){
    46. PageBean pageBean=new PageBean();
    47. pageBean.setRequest(request);
    48. // {}
    49. return this.clazzBiz.listMapPager(clazz,pageBean).get(0);
    50. }
    51. // 返回一个T对象
    52. @RequestMapping("/load")
    53. public Clazz load(HttpServletRequest request, Clazz clazz){
    54. PageBean pageBean=new PageBean();
    55. pageBean.setRequest(request);
    56. // {}
    57. return this.clazzBiz.listPager(clazz,pageBean).get(0);
    58. }
    59. // 混合
    60. // {
    61. // msg:" ",
    62. // code:200,
    63. // data:[ ]
    64. // }
    65. @RequestMapping("/hunhe")
    66. public Map hunhe(HttpServletRequest request, Clazz clazz){
    67. PageBean pageBean=new PageBean();
    68. pageBean.setRequest(request);
    69. List<Clazz> lst = this.clazzBiz.listPager(clazz, pageBean);
    70. Map map=new HashMap();
    71. map.put("data",lst);
    72. map.put("pagebean",pageBean);
    73. return map;
    74. }
    75. }

    index.jsp:

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: zjjt
    4. Date: 2022/8/22
    5. Time: 18:42
    6. To change this template use File | Settings | File Templates.
    7. --%>
    8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    9. <head>
    10. <title>测试json数据返回title>
    11. head>
    12. <a href="${pageContext.request.contextPath}/clz/json/list">返回list<T>对象a><hr>
    13. <a href="${pageContext.request.contextPath}/clz/json/listMap">返回list<Map>对象a><hr>
    14. <a href="${pageContext.request.contextPath}/clz/json/load?cid=1">返回T对象a><hr>
    15. <a href="${pageContext.request.contextPath}/clz/json/map?cid=1">返回Map对象a><hr>
    16. <a href="${pageContext.request.contextPath}/clz/json/hunhe">返回混合对象a><hr>
    17. body>
    18. html>

    运行结果:

    0ee72427ea434bd8b82e4f9158b2deaf.png

     点击测试:

    list对象

    7c79d46f49314cbdab3a31636535c5af.png

     list对象2278cee9e28b483a9fc0a3df16ab1ebe.png

      T对象

    d456802a56d945e99ccf267499db0446.png

      Map对象

    5759f2ac4dfb4cadac5055b186189941.png

     混合对象0a43ff0c544b40beb965498d1003ec90.png

     

    二,全局异常处理的三种形式

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

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

    我们现在来改进代码 进行全局异常处理

    jsonController:

    1. @RequestMapping("/list")
    2. public List list(HttpServletRequest request, Clazz clazz){
    3. PageBean pageBean=new PageBean();
    4. pageBean.setRequest(request);
    5. if(true){
    6. throw new RuntimeException("查询班级信息异常,异常存在于JsonController.list");
    7. }
    8. // [{},{}]
    9. return this.clazzBiz.listPager(clazz,pageBean);
    10. }

    ClazzBizImpl

    1. @Override
    2. public List listMapPager(Clazz clazz, PageBean pageBean) {
    3. if(true){
    4. throw new RuntimeException("查询班级信息异常,异常存在于ClazzBizImpl.list");
    5. }
    6. return clazzMapper.listMapPager(clazz);
    7. }

    接下来重新运行项目:

    c5879325f7ad455fb64e92843e87f6f4.png

     点击list对象时:

    edece817bd824eaa8ec427bfc0a5fe4b.png

     点击list对象时:

    7f3f2896b5214a32b6f547fe42bca556.png

     此时可以看到,两个异常 一个在控制层,一个在业务层,这样很不方便维护

    2.异常处理思路?

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

     3.SpringMVC异常分类

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

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

       3)使用@ControllerAdvice + @ExceptionHandler

    异常处理的三种方式:

    1、springmvc.xml中进行统一配置及处理(使用较少)

    springmvc.xml:

    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>

    新建一个error.jsp页面: 

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: zjjt
    4. Date: 2022/8/23
    5. Time: 14:11
    6. To change this template use File | Settings | File Templates.
    7. --%>
    8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    9. <html>
    10. <head>
    11. <title>错误信息页面title>
    12. head>
    13. <body>
    14. ${ex}
    15. body>
    16. html>

    再次运行:

    9b161e5c0dfc4042a23668612acdc2ba.png

      当点击“返回list对象”时:913935c6b2694e818d14cce084e954e9.png

     当点击“返回list<>Map对象”时:4af0f435b95f4b04bba9d14eed207fc3.png

     2、实现接口管理(使用较多)

    GlobalException :

    1. package com.ljj.exception;
    2. /**
    3. * @author ljj
    4. * @create 2022-08-23 14:24
    5. */
    6. public class GlobalException extends RuntimeException{
    7. public GlobalException() {
    8. }
    9. public GlobalException(String message) {
    10. super(message);
    11. }
    12. public GlobalException(String message, Throwable cause) {
    13. super(message, cause);
    14. }
    15. public GlobalException(Throwable cause) {
    16. super(cause);
    17. }
    18. public GlobalException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
    19. super(message, cause, enableSuppression, writableStackTrace);
    20. }
    21. }

    GlobalHandlerExceptionResovler :

    1. package com.ljj.exception;
    2. import org.springframework.stereotype.Component;
    3. import org.springframework.web.servlet.HandlerExceptionResolver;
    4. import org.springframework.web.servlet.ModelAndView;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletResponse;
    7. /**
    8. * @author ljj
    9. * @create 2022-08-23 14:31
    10. * 处理全局异常的解析器
    11. */
    12. @Component
    13. public class GlobalHandlerExceptionResovler implements HandlerExceptionResolver {
    14. /**
    15. *
    16. * @param httpServletRequest
    17. * @param httpServletResponse
    18. * @param o 目标对象
    19. * @param e 目标对象执行出现的异常对象
    20. * @return
    21. */
    22. @Override
    23. public ModelAndView resolveException(HttpServletRequest httpServletRequest,
    24. HttpServletResponse httpServletResponse,
    25. Object o, Exception e) {
    26. ModelAndView mv=new ModelAndView();
    27. mv.setViewName("error");
    28. if (e instanceof GlobalException){
    29. GlobalException exception=(GlobalException) e;
    30. mv.addObject("ex",exception.getMessage());
    31. mv.addObject("msg","全局异常,错误码501");
    32. }else if(e instanceof RuntimeException){
    33. RuntimeException exception=(RuntimeException) e;
    34. mv.addObject("ex",exception.getMessage());
    35. mv.addObject("msg","运行时异常,错误码601");
    36. }
    37. return mv;
    38. }
    39. }

     JsonController:

    1. // 返回一个T对象
    2. @RequestMapping("/load")
    3. public Clazz load(HttpServletRequest request, Clazz clazz){
    4. PageBean pageBean=new PageBean();
    5. pageBean.setRequest(request);
    6. if(true) {
    7. throw new GlobalException("系统繁忙,请参考E007;");
    8. }
    9. // {}
    10. return this.clazzBiz.listPager(clazz,pageBean).get(0);
    11. }

    error.jsp

    1. <%--
    2. Created by IntelliJ IDEA.
    3. User: zjjt
    4. Date: 2022/8/23
    5. Time: 14:11
    6. To change this template use File | Settings | File Templates.
    7. --%>
    8. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    9. <html>
    10. <head>
    11. <title>错误信息页面title>
    12. head>
    13. <body>
    14. ${msg}
    15. <hr>
    16. ${ex}
    17. body>
    18. html>

    运行效果:

    9002b3d7e5ec4b64b8f848a4025a8af9.png

     

     当点击“返回list对象”时:

    94083fb44eed4cddb4791d0240287054.png

     当点击“返回list<>Map对象”时:

    7c2827cdc55443ba825713000bc19698.png

      当点击“返回T对象”时:

    7dda3a11555042e29807e0fcdee01c00.png

       当点击“返回Map对象”时:

    dc30370152584350a5661b9cfef54089.png

     3、@controllerAdvice+@ExceptionHandler
    GlobalExceptionResolver :

    1. package com.ljj.exception;
    2. import org.springframework.web.bind.annotation.ControllerAdvice;
    3. import org.springframework.web.bind.annotation.ExceptionHandler;
    4. import org.springframework.web.servlet.ModelAndView;
    5. /**
    6. * @author ljj
    7. * @create 2022-08-23 15:00
    8. */
    9. @ControllerAdvice
    10. public class GlobalExceptionResolver {
    11. @ExceptionHandler
    12. public ModelAndView handler(Exception e) {
    13. ModelAndView mv=new ModelAndView();
    14. mv.setViewName("error");
    15. if (e instanceof GlobalException){
    16. GlobalException exception=(GlobalException) e;
    17. mv.addObject("ex",exception.getMessage());
    18. mv.addObject("msg","全局异常,GlobalExceptionResolver,错误码501");
    19. }else if(e instanceof RuntimeException){
    20. RuntimeException exception=(RuntimeException) e;
    21. mv.addObject("ex",exception.getMessage());
    22. mv.addObject("msg","运行时异常,GlobalExceptionResolver,错误码601");
    23. }
    24. return mv;
    25. }
    26. }

     运行效果:

    ef43ff67f7394ae7a027f00dd73ec999.png

     

    当点击“返回list对象”时:

    d33aed946946408eae79f7b7d277898b.png

     当点击“返回list<>Map对象”时:

    c66ded6425404f49950cc1396b3da348.png

        当点击“返回T对象”时:

     9f28f0cf3efb4579baf222407f917cdc.png

        当点击“返回Map对象”时:

     12175b904d274887b82f4e4f84c6bff1.png

     三、json统一处理

    GlobalExceptionResolver2 :

    1. package com.ljj.exception;
    2. import org.springframework.web.bind.annotation.ExceptionHandler;
    3. import org.springframework.web.bind.annotation.RestControllerAdvice;
    4. import java.util.HashMap;
    5. import java.util.Map;
    6. /**
    7. * @author ljj
    8. * @create 2022-08-23 15:00
    9. *
    10. * 当出现异常,统一向前端相应错误信息的json对象数据
    11. */
    12. @RestControllerAdvice
    13. public class GlobalExceptionResolver2 {
    14. @ExceptionHandler
    15. public Map handler(Exception e) {
    16. Map map=new HashMap();
    17. if (e instanceof GlobalException){
    18. GlobalException exception=(GlobalException) e;
    19. map.put("ex",exception.getMessage());
    20. map.put("msg","全局异常,GlobalExceptionResolver,错误码501");
    21. }else if(e instanceof RuntimeException){
    22. RuntimeException exception=(RuntimeException) e;
    23. map.put("ex",exception.getMessage());
    24. map.put("msg","运行时异常,GlobalExceptionResolver,错误码601");
    25. }
    26. return map;
    27. }
    28. }

     当点击“返回list对象”时:

    875482d5c9eb4b67988bae06c1b31e2c.png

     当返回list对象时:

    045e21dcde5c43478c24324bca773818.png

     当点击“返回T对象”时:​​​​​​​

    3fc7ed40f8214a789c3d87c6d9339096.png

      当点击“返回Map对象”时:

     

    47581f611d8041a5bf94ff86aa6b0b1a.png

    ok,本期内容到此结束啦,我们下期见

     

  • 相关阅读:
    ssti总结
    嵌入式Linux--进程间通信--共享内存
    轻量容器引擎Docker基础使用
    jboss/CVE-2017-7504
    Python数据攻略-Pandas与地理空间数据分析
    【前端】yarn install
    SpringCloudAlibaba_2
    反渗透,sql注入漏洞扫描工具
    Web开发-基础知识扫盲
    狂刷《Java权威面试指南(阿里版)》,冲击“金九银十”有望了
  • 原文地址:https://blog.csdn.net/weixin_64313980/article/details/126490316