希望你永远不懂JSON和全局异常处理
目录
一,json解析
二,全局异常处理的3种形式
三,json统一处理
一,json解析
json的形式:
{}->json对象 T Map
[]-> json数组 List<T> List<Map>
{
msg:"";
code:200, ->json 混合对象
data:[]
}
得到上述三种json形式的数据的方法:
1,导入pom依赖 jackson(让SpringMVC支持json数据转换)
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.3</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.3</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.9.3</version></dependency>
2.在SpringMVC.xml中配置适配器(做json数据转换)
<!--支持json数据返回的适配器--><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"><!--处理中文乱码以及避免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></bean>
3.使用注解@responseBody 能够将任何的数据转换为json对象
在Biz层中写出以下几个方法:
1.返回List<T>
2.返回List<Map>
3.返回T
4.返回Map
5.返回混合
ClazzBiz:
package com.ljj.ssm.biz;import com.ljj.model.Clazz;
import com.ljj.ssm.util.PageBean;import java.util.List;
import java.util.Map;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<Clazz> listPager(Clazz clazz, PageBean pageBean);List<Map> listMapPager(Clazz clazz, PageBean pageBean);
}
在ClazzBIzImpl中添加方法:
@Overridepublic List<Map> listMapPager(Clazz clazz, PageBean pageBean) {return clazzMapper.listMapPager(clazz);}
ClazzMapper:
List <Map> listMapPager(Clazz clazz);
ClazzMapper.xml:
<select id="listMapPager" resultType="java.util.Map" parameterType="com.ljj.ssm.model.Clazz" >select<include refid="Base_Column_List" />from t_struts_class<where><if test="cname !=null and cname !=''">and cname like concat('%')</if><if test="cid !=null and cid !=''">and cid = #{cid}</if></where>order by cid desc</select>
JsonController :
package com.ljj.controller;import com.ljj.model.Clazz;
import com.ljj.ssm.biz.ClazzBiz;
import com.ljj.ssm.util.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;//@ResponseBody+@Controller=@RestController@RestController
@RequestMapping("/clz/json")
public class JsonController {@Autowiredprivate ClazzBiz clazzBiz;@RequestMapping("/clzEdit")public String clzEdit(){System.out.println("JsonController.clzEdit");return "clzEdit";}/*** list<T>*/@RequestMapping("/list")public List<Clazz> list(HttpServletRequest request, Clazz clazz){PageBean pageBean=new PageBean();pageBean.setRequest(request);
// [{},{}]return this.clazzBiz.listPager(clazz,pageBean);}/*** list<Map>*/@RequestMapping("/listMap")public List<Map> listMap(HttpServletRequest request, Clazz clazz){PageBean pageBean=new PageBean();pageBean.setRequest(request);
// [{},{}]return this.clazzBiz.listMapPager(clazz,pageBean);}// 返回单个Map集合@RequestMapping("/map")public Map map(HttpServletRequest request, Clazz clazz){PageBean pageBean=new PageBean();pageBean.setRequest(request);// {}return this.clazzBiz.listMapPager(clazz,pageBean).get(0);}// 返回一个T对象@RequestMapping("/load")public Clazz load(HttpServletRequest request, Clazz clazz){PageBean pageBean=new PageBean();pageBean.setRequest(request);// {}return this.clazzBiz.listPager(clazz,pageBean).get(0);}// 混合
// {
// msg:" ",
// code:200,
// data:[ ]
// }@RequestMapping("/hunhe")public Map hunhe(HttpServletRequest request, Clazz clazz){PageBean pageBean=new PageBean();pageBean.setRequest(request);List<Clazz> lst = this.clazzBiz.listPager(clazz, pageBean);Map map=new HashMap();map.put("data",lst);map.put("pagebean",pageBean);return map;}}
index.jsp:
<%--Created by IntelliJ IDEA.User: zjjtDate: 2022/8/22Time: 18:42To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %><head><title>测试json数据返回</title>
</head>
<a href="${pageContext.request.contextPath}/clz/json/list">返回list<T>对象</a><hr>
<a href="${pageContext.request.contextPath}/clz/json/listMap">返回list<Map>对象</a><hr>
<a href="${pageContext.request.contextPath}/clz/json/load?cid=1">返回T对象</a><hr>
<a href="${pageContext.request.contextPath}/clz/json/map?cid=1">返回Map对象</a><hr>
<a href="${pageContext.request.contextPath}/clz/json/hunhe">返回混合对象</a><hr>
</body>
</html>
运行结果:
点击测试:
list<T>对象
list<Map>对象
T对象
Map对象
混合对象
二,全局异常处理的三种形式
1.为什么需要全局异常处理
因为:系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。
我们现在来改进代码 进行全局异常处理
jsonController:
@RequestMapping("/list")public List<Clazz> list(HttpServletRequest request, Clazz clazz){PageBean pageBean=new PageBean();pageBean.setRequest(request);if(true){throw new RuntimeException("查询班级信息异常,异常存在于JsonController.list");}// [{},{}]return this.clazzBiz.listPager(clazz,pageBean);}
ClazzBizImpl
@Overridepublic List<Map> listMapPager(Clazz clazz, PageBean pageBean) {if(true){throw new RuntimeException("查询班级信息异常,异常存在于ClazzBizImpl.list");}return clazzMapper.listMapPager(clazz);}
接下来重新运行项目:
点击list<T>对象时:
点击list<Map>对象时:
此时可以看到,两个异常 一个在控制层,一个在业务层,这样很不方便维护
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:
<!--统一异常处理--><!-- springmvc提供的简单异常处理器 --><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><!-- 定义默认的异常处理页面 --><property name="defaultErrorView" value="error"/><!-- 定义异常处理页面用来获取异常信息的变量名,也可不定义,默认名为exception --><property name="exceptionAttribute" value="ex"/><!-- 定义需要特殊处理的异常,这是重要点 --><property name="exceptionMappings"><props><prop key="java.lang.RuntimeException">error</prop></props><!-- 还可以定义其他的自定义异常 --></property></bean>
新建一个error.jsp页面:
<%--Created by IntelliJ IDEA.User: zjjtDate: 2022/8/23Time: 14:11To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>错误信息页面</title>
</head>
<body>
${ex}
</body>
</html>
再次运行:
当点击“返回list<T>对象”时:
当点击“返回list<>Map对象”时:
2、实现接口管理(使用较多)
GlobalException :
package com.ljj.exception;/*** @author ljj* @create 2022-08-23 14:24*/
public class GlobalException extends RuntimeException{public GlobalException() {}public GlobalException(String message) {super(message);}public GlobalException(String message, Throwable cause) {super(message, cause);}public GlobalException(Throwable cause) {super(cause);}public GlobalException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);}
}
GlobalHandlerExceptionResovler :
package com.ljj.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;/*** @author ljj* @create 2022-08-23 14:31* 处理全局异常的解析器*/@Component
public class GlobalHandlerExceptionResovler implements HandlerExceptionResolver {/**** @param httpServletRequest* @param httpServletResponse* @param o 目标对象* @param e 目标对象执行出现的异常对象* @return*/@Overridepublic 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","全局异常,错误码501");}else if(e instanceof RuntimeException){RuntimeException exception=(RuntimeException) e;mv.addObject("ex",exception.getMessage());mv.addObject("msg","运行时异常,错误码601");}return mv;}
}
JsonController:
// 返回一个T对象@RequestMapping("/load")public Clazz load(HttpServletRequest request, Clazz clazz){PageBean pageBean=new PageBean();pageBean.setRequest(request);if(true) {throw new GlobalException("系统繁忙,请参考E007;");}// {}return this.clazzBiz.listPager(clazz,pageBean).get(0);}
error.jsp
<%--Created by IntelliJ IDEA.User: zjjtDate: 2022/8/23Time: 14:11To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>错误信息页面</title>
</head>
<body>
${msg}
<hr>
${ex}
</body>
</html>
运行效果:
当点击“返回list<T>对象”时:
当点击“返回list<>Map对象”时:
当点击“返回T对象”时:
当点击“返回Map对象”时:
3、@controllerAdvice+@ExceptionHandler
GlobalExceptionResolver :
package com.ljj.exception;import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;/*** @author ljj* @create 2022-08-23 15:00*/
@ControllerAdvice
public class GlobalExceptionResolver {@ExceptionHandlerpublic ModelAndView handler(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","全局异常,GlobalExceptionResolver,错误码501");}else if(e instanceof RuntimeException){RuntimeException exception=(RuntimeException) e;mv.addObject("ex",exception.getMessage());mv.addObject("msg","运行时异常,GlobalExceptionResolver,错误码601");}return mv;}}
运行效果:
当点击“返回list<T>对象”时:
当点击“返回list<>Map对象”时:
当点击“返回T对象”时:
当点击“返回Map对象”时:
三、json统一处理
GlobalExceptionResolver2 :
package com.ljj.exception;import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import java.util.HashMap;
import java.util.Map;/*** @author ljj* @create 2022-08-23 15:00** 当出现异常,统一向前端相应错误信息的json对象数据*/@RestControllerAdvice
public class GlobalExceptionResolver2 {@ExceptionHandlerpublic Map handler(Exception e) {Map map=new HashMap();if (e instanceof GlobalException){GlobalException exception=(GlobalException) e;map.put("ex",exception.getMessage());map.put("msg","全局异常,GlobalExceptionResolver,错误码501");}else if(e instanceof RuntimeException){RuntimeException exception=(RuntimeException) e;map.put("ex",exception.getMessage());map.put("msg","运行时异常,GlobalExceptionResolver,错误码601");}return map;}}
当点击“返回list<T>对象”时:
当返回list<T>对象时:
当点击“返回T对象”时:
当点击“返回Map对象”时:
ok,本期内容到此结束啦,我们下期见
希望你永远不懂JSON和全局异常处理相关推荐
- SpringMVC之JSON和全局异常处理
目录 一.json解析 json的形式 SpringMVC框架如何产生上述三种形式的数据? 1.导入pom依赖 Jackson 2.配置SpringMVC.xml 配置适配器 ...
- springmvc全局异常处理ControllerAdvice区分返回响应类型是页面还是JSON
springmvc全局异常处理ControllerAdvice区分返回响应类型是页面还是JSON 参考文章: (1)springmvc全局异常处理ControllerAdvice区分返回响应类型是页面 ...
- SpringMvc之Json全局异常处理
目录 一. SpringMvc框架对Json数据的支持 1. Json数据的格式分类: 2. SpringMvc框架如何产生上述三种json格式数据 2.1导入pom依赖 2.2 在Spri ...
- JSON和几个的全局异常处理
目录 一.SpringMVC对JSON的支持 1.json的各种场景 二.SpringMVC的全局异常处理的3种形式 1.非全局异常处理问题演示 ① 为什么要全局异常处理 ② 异常处理思路 ③ Spr ...
- 从零开始学习springmvc(5)——Spring国际化和全局异常处理
[项目地址] 从零开始学习springmvc 如果觉得有用可以关注一下公众号:码字不易,求赞求关注 五.Spring国际化和全局异常处理 五.Spring国际化和全局异常处理 5.1 国际化介绍 5. ...
- 别再写满屏的try-catch了,真丑,全局异常处理不会吗?
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:巨人大哥 www.cnblogs.com/juren ...
- 你这代码写得真丑,满屏的try-catch,全局异常处理不会吗?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 # 背景 软件开发过程中,不可避免的是需要处理各种异常,就我自己来 ...
- SpringBoot的全局异常处理的优雅吃法!要进来学习下吗
SpringBoot的全局异常处理的优雅吃法!要进来学习下吗 SpringBoot全局异常准备 开发准备 环境要求 JDK :1.8 SpringBoot :1.5.17.RELEASE 首先还是Ma ...
- 【Java从0到架构师】项目实战 - 前后端分离、后端校验、Swagger、全局异常处理
项目实战 - 前后端分离.后端校验.Swagger Layui 同源策略 SpringMVC 实现 CORS 后端校验 - hibernate-validator 方法的 Model 参数校验 方法的 ...
最新文章
- (转) Unity3D 使用Texturepacker打包工具制作NGUI(Atlas)图集
- 计算机开不开机是什么原因是什么原因,电脑开不了机的原因,详细教您电脑开不了机怎么办...
- Dict Set usage
- echarts 堆叠树状图排序
- 每天一道LeetCode-----生命游戏
- 亚马逊Rekognition发布针对人脸检测、分析和识别功能的多项更新
- maven-settings.xml的那些事
- Centos7静态ip设置(亲测有效)
- python中property魔法方法原理_Python类中的魔法方法之 __slots__原理解析
- 什么是Spring?Spring是什么?
- JavaScript鼠标经过图片晃动效果
- 从零开始学pythonjava_从零开始学习python:demo2.4
- 深度解读CSS3 position的属性
- 彻底搞懂Scrapy的中间件(三)
- Unitils集成DBUnit的问题-解决方案
- 中学数学证明所有自然数和为-1/12
- python 密度聚类_Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
- jsmind 线条_使用jsMind显示思维导图
- 计算机三级权限管理方法,Serv―U 三级用户权限机制及配置一例
- html 组合快捷键,ctrl常用组合键有哪些
热门文章
- 超炫物理动态图!收藏吧,吓死宝宝了...
- 计算机二级与英语四级哪个更严,国家计算机二级和英语四级过级经验总结
- Linux驱动之i2c用户态函数调用
- kube-apiserver源码分析
- 区块链技术下的反向保理业务模式设计
- 前端中英文切换,复制所有页面 / i18n
- 【2022 机器人领域研究热点与发展趋势综述】
- 检测苹果推送证书有效性
- 漫画:什么是B+树,B+树层数计算(面试官直呼内行)
- Oracle加索引的时候快照过久,【Oracle 11g】ORA-01555: snapshot too old(快照过旧)错误