SpringMVC之JSON和全局异常处理
目录
一、json解析
json的形式
SpringMVC框架如何产生上述三种形式的数据?
1、导入pom依赖 Jackson
2、配置SpringMVC.xml 配置适配器
(作用是做json数据转换的)
3、使用注解@responseBody 能够将任何的数据转成json对象
ClazzMapper.xml:
JsonController :
运行效果:
二、全局异常处理的3种形式
1.为什么要全局异常处理?
2.异常处理思路?
3.SpringMVC异常分类
异常处理的三种方式:
1、springmvc.xml中进行统一配置及处理(使用较少)
2、实现接口管理(使用较多)
3、@controllerAdvice+@ExceptionHandler
三、json统一处理
一、json解析
json的形式
{ } ——>为json对象 有两种形式拿到json对象:T、Map
[ ] ——>为json数组 有两种形式拿到json对象:List<T>、List<Map>
{
msg:" ",
code:200, ——>为json混合对象
data:[ ]
}
SpringMVC框架如何产生上述三种形式的数据?
步骤如下:
1、导入pom依赖 Jackson
<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对象
(但在实际开发中不太会使用这种形式,就是把@responseBody加到方法上面去。
可以把它删掉,使用另一个注解@restcontroller加到类上面,因为做json数据交互的话,通常整个类里面的所有方法都是要返回json数据的。
而@responseBody+@controller是 在某一个类里面 既有返回json数据又有返回跳转页面的。所以一般用@restcontroller来提高用户的体验感)
返回List<T>
返回List<Map>
返回T
返回Map
返回混合
ClazzBiz:
package com.ycx.ssm.biz;import com.ycx.model.Clazz;
import com.ycx.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.zking.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.ycx.controller;import com.ycx.model.Clazz;
import com.ycx.ssm.biz.ClazzBiz;
import com.ycx.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>
运行效果:
二、全局异常处理的3种形式
1.为什么要全局异常处理?
我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。在开发中,不管是dao层、service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护。
JsonController:
/*** list<T>*/@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.ycx.exception;/*** @author 杨总* @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.ycx.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 杨总* @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.ycx.exception;import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;/*** @author 杨总* @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统一处理
因为在开发中几乎不用jsp跳页面,大多都是做前后端分离的,返回的都是json数据,做json数据交互。
所以把json和全局异常处理结合在一起
新建一个类,用来当出现异常,统一向前端相应错误信息的json对象数据
使用注解@restcontrollerAdvice
GlobalExceptionResolver2 :
package com.ycx.exception;import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import java.util.HashMap;
import java.util.Map;/*** @author 杨总* @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<>Map对象”时:
当点击“返回T对象”时:
当点击“返回Map对象”时:
今日相关知识就到这里,拜拜~
SpringMVC之JSON和全局异常处理相关推荐
- 希望你永远不懂JSON和全局异常处理
目录 一,json解析 二,全局异常处理的3种形式 三,json统一处理 一,json解析 json的形式: {}->json对象 T Map []-> json数组 List ...
- springmvc全局异常处理ControllerAdvice区分返回响应类型是页面还是JSON
springmvc全局异常处理ControllerAdvice区分返回响应类型是页面还是JSON 参考文章: (1)springmvc全局异常处理ControllerAdvice区分返回响应类型是页面 ...
- SpringMvc之Json全局异常处理
目录 一. SpringMvc框架对Json数据的支持 1. Json数据的格式分类: 2. SpringMvc框架如何产生上述三种json格式数据 2.1导入pom依赖 2.2 在Spri ...
- 从零开始学习springmvc(5)——Spring国际化和全局异常处理
[项目地址] 从零开始学习springmvc 如果觉得有用可以关注一下公众号:码字不易,求赞求关注 五.Spring国际化和全局异常处理 五.Spring国际化和全局异常处理 5.1 国际化介绍 5. ...
- springmvc高级(拦截器,全局异常处理,文件上传)
SpringMVC 1.文件上传 文件上传: 指的就是将用户本地计算机中文件上传到服务器上的过程称之为文件上传 1).文件上传编程步骤 # 1.项目中引入相关依赖 <dependency> ...
- JSON和几个的全局异常处理
目录 一.SpringMVC对JSON的支持 1.json的各种场景 二.SpringMVC的全局异常处理的3种形式 1.非全局异常处理问题演示 ① 为什么要全局异常处理 ② 异常处理思路 ③ Spr ...
- SpringMVC 全局异常处理的简单应用
2019独角兽企业重金招聘Python工程师标准>>> 在SpringMVC框架的项目开发过程中,你还在使用 try{} catch(){} 输出异常吗?,那样你就真的OUT了,Sp ...
- 别再写满屏的try-catch了,真丑,全局异常处理不会吗?
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:巨人大哥 www.cnblogs.com/juren ...
- 你这代码写得真丑,满屏的try-catch,全局异常处理不会吗?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 # 背景 软件开发过程中,不可避免的是需要处理各种异常,就我自己来 ...
最新文章
- 语音信号处理_书单 | 语音研究进阶指南
- 一次搞定:分布式缓存 Redis 集群搭建!
- php和html和javascript,php和javascript区别有哪些
- 关于如何提高SQL Server Compact的查询性能
- 使用SQLQuery
- 大疆 机器学习 实习生_我们的数据科学机器人实习生
- 程序员解决20年前的加密问题
- apache shiro版本查看_深入学习SpringBoot(四):springboot整合shiro
- fig,ax = plt.subplots()
- HALCON 21.11:深度学习笔记---异常检测(9)
- linux装go环境脚本,linux中用shell快速安装配置Go语言的开发环境
- Android 集成腾讯播放器sdk(支持多格式,直播,m3u8等)重点是免费
- 用计算机排列姓氏顺序,电脑excel文档中如何根据姓氏笔画来排序
- linux 心脏滴血漏洞,漏洞bash近日“破壳”,当心再次“心脏出血”
- 从VB来看-InsertionSort(VB插入排序)
- 《庄子》中说到,“一尺之棰,日取其半,万世不竭”。第一天有一根长度为 a(a\le 10^9)a(a≤10 9 ) 的木棍,从第二天开始,每天都要将这根木棍锯掉一半(每次除2向下取整)第几天变为1
- linux 只读文件 删除,linux – 我无法删除文件’rm:无法删除X只读文件系统’
- Serpent.AI - 游戏代理框架(Python)
- 30支队伍将在阿布扎比角逐奖金达500万美元的2020年穆罕默德-本-扎耶德国际机器人挑战赛
- 机器学习常用算法 框图
热门文章
- 虚拟驾驶环境搭建(一)
- Windows壁纸和Bing主页壁纸提取(仅作测试MarkDown)
- simulink同步发电机模型_电机控制仿真模型——电机模型简化公式
- SpringCloud快速入门(基于狂神讲解)
- php中js画图,使用JS画图之点、线、面_javascript技巧
- docker容器ssh自启动设置
- DSLR Video Tips: Software 数码单反相机视频提示:软件 Lynda课程中文字幕
- 新版SP出现TDR值太低警告的解决办法
- Android系统辅助触控,Assistive Touch for Android
- [问题已处理]-docker-compose无法停止harbor