SpringMVC系列(六)之JSON数据返回以及异常处理机制

目录

前言

一. JSON概述

二. JSON数据返回

1. 导入pom依赖

2. 添加配置文件(spring-mvc.xml)

3. @ResponseBody注解使用

4. 效果展示

5. Jackson介绍

三. 全局异常处理

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

2. 异常处理思路

3. 异常处理方式一

4. 异常处理方式二

5. 异常处理方式三


前言

Spring MVC 在传递数据时,通常都需要对数据的类型和格式进行转换。而这些数据不仅可以是常见的 String 类型,还可以是 JSON 等其他类型。
JSON 是近些年一种比较流行的数据格式,它与 XML 相似,也是用来存储数据的。但相较于 XML,JSON 数据占用的空间更小,解析速度更快。因此,使用 JSON 数据进行前后台的数据交互也是一种十分常见的手段。

另外,在实际的应用开发中,经常会不可避免地遇到各种可预知的、不可预知的异常,此时我们就需要对这些异常处理,以保证程序正常运行。
本篇将对 Spring MVC 的 JSON 类型数据返回以及异常处理进行分享。

一. JSON概述

JSON(JavaScript Object Notation,JS 对象标记)是一种轻量级的数据交互格式。与 XML 一样,JSON 也是一种基于纯文本的数据格式。通过它,我们不仅能够传递 String、Number、Boolean 等简单类型的数据,还可以传递数组、Object 对象等复杂类型的数据。

二. JSON数据返回

Spring MVC 为我们提供了两个十分重要的与 JSON 格式转换相关的注解,它们分别是 @RequestBody 和 @ResponseBody。

注解位置说明
@RequestBody方法的形参上该注解用于将请求体中的数据绑定到控制器方法的形参上。
@ResponseBody方法上该注解用于将控制器方法的返回值,直接作为响应报文的响应体响应到
浏览器上。

这里以 @ResponseBody为例

JSON 支持对象结构,数组结构,对象和数组组合成的复杂结构

1. 导入pom依赖

<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. 添加配置文件(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"><!--处理中文乱码以及避免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注解使用

@ResponseBody注解的作用是将Controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。

注意:在使用此注解之后不会再走视图解析器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。

controller层

package com.xissl.web;import com.xissl.biz.clazzBiz;
import com.xissl.model.clazz;
import com.xissl.utils.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Controller
@RequestMapping("/clz/json")
public class JsonController {@Autowiredprivate clazzBiz clazzBiz;/*** 返回List<T>* @param req* @param clazz* @return*/@ResponseBody@RequestMapping("/list")public List<clazz> list(HttpServletRequest req, clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<clazz> lst = this.clazzBiz.listPager(clazz, pageBean);return lst;}/*** 返回T* @param req* @param clazz* @return*/@ResponseBody@RequestMapping("/load")public clazz load(HttpServletRequest req, clazz clazz){if(clazz.getCid() != null){List<clazz> lst = this.clazzBiz.listPager(clazz, null);return lst.get(0);}return null;}/*** 返回List<Map>* @param req* @param clazz* @return*/@ResponseBody@RequestMapping("/mapList")public List<Map> mapList(HttpServletRequest req, clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<Map> lst = this.clazzBiz.mapListPager(clazz, pageBean);return lst;}/*** 返回Map* @param req* @param clazz* @return*/@ResponseBody@RequestMapping("/mapLoad")public Map mapLoad(HttpServletRequest req, clazz clazz){if(clazz.getCid() != null){List<Map> lst = this.clazzBiz.mapListPager(clazz, null);return lst.get(0);}return null;}@ResponseBody@RequestMapping("/all")public Map all(HttpServletRequest req, clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<clazz> lst = this.clazzBiz.listPager(clazz, pageBean);Map map = new HashMap();map.put("lst",lst);map.put("pageBean",pageBean);return map;}@ResponseBody@RequestMapping("/jsonStr")public String jsonStr(HttpServletRequest req, clazz clazz){return "clzEdit";}}

业务逻辑层

   List<Map> mapListPager(clazz clazz, PageBean pageBean);
    @Overridepublic List<Map> mapListPager(clazz clazz, PageBean pageBean) {return clazzMapper.mapListPager(cl

 mapper接口

    List<Map> mapListPager(clazz clazz);

 sql映射文件

  <select id="mapListPager" resultType="java.util.Map" parameterType="com.xissl.model.clazz" >select<include refid="Base_Column_List" />from t_struts_class<where><if test="cname != null">and cname like concat('%',#{cname},'%')</if></where></select>

4. 效果展示

对象结构

JSON 的对象结构以“{”开始,以“}”结束,中间则由 0 个或多个以英文的逗号(即“,”)分隔的 key/value 对构成。(实体或集合T/map)

数组结构

JSON 的数组结构以“[”开始、以“]”结束,中间部分由 0 个或多个以英文的逗号(即“,”)分隔的值列表组成。(List<T>/List<map>)

混合结构

JSON数据返回第一种方式是在方法上添加@ResponseBody注解。

除此之外还可以将@ResponseBody注解放于类上。

以及第三种方式,将@Controller与@ResponseBody合并,即@RestController

5. Jackson介绍

Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。Jackson所依赖的jar包较少,简单易用并且性能也要相对高些,并且Jackson社区相对比较活跃,更新速度也比较快。

特点

  • 容易使用,提供了高层次外观,简化常用的用例。

  • 无需创建映射,API提供了默认的映射大部分对象序列化。

  • 性能高,快速,低内存占用

  • 创建干净的json

  • 不依赖其他库

  • 代码开源

常用注解

注解说明
@JsonIgnore作用在字段或方法上,用来完全忽略被注解的字段和方法对应的属性
@JsonProperty作用在字段或方法上,用来对属性的序列化/反序列化,可以用来避免遗漏属性,同时提供对属性名称重命名
@JsonIgnoreProperties作用在类上,用来说明有些属性在序列化/反序列化时需要忽略掉
@JsonUnwrapped作用在属性字段或方法上,用来将子JSON对象的属性添加到封闭的JSON对象
@JsonFormat指定序列化日期/时间值时的格式

三. 全局异常处理

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

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

2. 异常处理思路

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

3. 异常处理方式一

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

在配置文件(spring-mvc.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>

添加一个异常代码

 

    @ResponseBody@RequestMapping("/list")public List<clazz> list(HttpServletRequest req, clazz clazz){PageBean pageBean = new PageBean();pageBean.setRequest(req);List<clazz> lst = this.clazzBiz.listPager(clazz, pageBean);System.out.println(1 / 0);return lst;}

异常处理界面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
出错咯......
${ex}
</body>
</html>

 测试效果:

4. 异常处理方式二

package com.xissl.exception;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);}
}

1.通过instanceof判断异常类型

2.通过设置mv.setView(new MappingJackson2JsonView())方式返回JSON数据

package com.xissl.component;import com.xissl.exception.GlobalException;
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;@Component
public class GlobalExceptionHandler implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,Object o, Exception e) {ModelAndView mv = new ModelAndView();mv.setViewName("error");if (e instanceof GlobalException){GlobalException globalException = (GlobalException) e;mv.addObject("ex",globalException.getMessage());mv.addObject("msg","全局异常....");}else if (e instanceof RuntimeException){RuntimeException runtimeException = (RuntimeException) e;mv.addObject("ex",runtimeException.getMessage());mv.addObject("msg","运行时异常....");}else {mv.addObject("ex",e.getMessage());mv.addObject("msg","其它异常....");}return mv;}
}
    @ResponseBody@RequestMapping("/jsonStr")public String jsonStr(HttpServletRequest req, clazz clazz){if(true)throw new GlobalException("又出错咯......");return "clzEdit";}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
出错咯......
${ex}
<br>
${msg}
</body>
</html>

5. 异常处理方式三

package com.xissl.component;import com.xissl.exception.GlobalException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.HashMap;
import java.util.Map;@ControllerAdvice
public class GlobalExceptionResolver {// 返回错误json数据@ResponseBody@ExceptionHandlerpublic Map handler(Exception e){Map map = new HashMap();if (e instanceof GlobalException){GlobalException globalException = (GlobalException) e;map.put("ex",globalException.getMessage());map.put("msg","全局异常....");}else if (e instanceof RuntimeException){RuntimeException runtimeException = (RuntimeException) e;map.put("ex",runtimeException.getMessage());map.put("msg","运行时异常....");}else {map.put("ex",e.getMessage());map.put("msg","其它异常....");}return map;}
}

 这段代码运行后展示的效果是JSON形式的异常信息

package com.xissl.component;import com.xissl.exception.GlobalException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;import java.util.HashMap;
import java.util.Map;@ControllerAdvice
public class GlobalExceptionResolver {//    跳转错误页面@ExceptionHandlerpublic ModelAndView handler(Exception e){ModelAndView mv = new ModelAndView();mv.setViewName("error");if (e instanceof GlobalException){GlobalException globalException = (GlobalException) e;mv.addObject("ex",globalException.getMessage());mv.addObject("msg","全局异常....");}else if (e instanceof RuntimeException){RuntimeException runtimeException = (RuntimeException) e;mv.addObject("ex",runtimeException.getMessage());mv.addObject("msg","运行时异常....");}return mv;}}

  这段代码运行后展示的效果是jsp界面的异常信息

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/78311.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pip命令来查看当前激活的虚拟环境

要查看已安装的虚拟环境&#xff0c;您可以使用以下命令&#xff1a; pip freeze该命令将列出所有已安装的包及其版本信息。在虚拟环境中运行时&#xff0c;它将仅显示该虚拟环境中安装的包。 这将列出所有已创建的虚拟环境以及当前激活的环境。 python -m venv list

windows下安装redis扩展库

1.根据PHP版本号&#xff0c;编译器版本号和CPU架构 选择php_redis和php_igbinary文件(如果是选择线程的情况下需要再去配置php5ts.dll) windows.php.net - /downloads/pecl/releases/redis/ windows.php.net - /downloads/pecl/releases/igbinary/ php_igbinary-3.1.2-7.2-…

02_Flutter自定义Sliver组件实现分组列表吸顶效果

02_Flutter自定义Sliver组件实现分组列表吸顶效果 一.先上效果图 二.列表布局实现 比较简单&#xff0c;直接上代码&#xff0c;主要使用CustomScrollView和SliverToBoxAdapter实现 _buildSection(String title) {return SliverToBoxAdapter(child: RepaintBoundary(child: C…

数据分析之面试题目汇总(万字解读)

1、解释数据清洗的过程及常见的清洗方法。 数据清洗是指在数据分析过程中对数据进行检查、处理和纠正的过程&#xff1b;是数据预处理的一步&#xff0c;用于处理数据集中的无效、错误、缺失或冗余数据 常见的清洗方法包括&#xff1a;处理缺失值、处理异常值、去除重复值、统一…

Java 并发编程面试题——Fork/Join 框架

目录 1.什么是 Fork/Join 框架&#xff1f;2.什么是工作窃取算法&#xff1f;它有什么作用&#xff1f;有什么优缺点&#xff1f;3.如何设计一个 Fork/Join 框架&#xff1f;4.如何使用 Fork/Join 框架&#xff1f;5.Fork/Join 框架的实现原理是什么&#xff1f;5.1.ForkJoinTa…

论文笔记:一分类及其在大数据中的潜在应用综述

0 概述 论文&#xff1a;A literature review on one‑class classification and its potential applications in big data 发表&#xff1a;Journal of Big Data 在严重不平衡的数据集中&#xff0c;使用传统的二分类或多分类通常会导致对具有大量实例的类的偏见。在这种情况…

字符串之间的转换(char*、const char*、char[]、string、QString、QByteArray、int、double)

目录 一、申请空间的几种方法&#xff1a; 1、C语言 2、C 二、各个字符串的转换 1、char* 与 unsigned char*、char* 与 const char*、char* 与 char[ ] 2、string 与 char*、string 与 unsigned char*、string 与 QString、string 与 int、double 3、QString 与 int 、…

重新定义每天进步一点点

日拱一卒&#xff0c;每天进步一点点~ 这个主题之前写过一次&#xff0c;今天看了《全情投入》又有了新的感触&#xff0c;于是将其记录下来。 关于目标的设定问题 目标不是改变自己的日常行动&#xff0c;而是改变进行活动时的思维&#xff01; 有些事情&#xff0c;坚持下…

企业进行媒体宣传的重要性

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体邀约&#xff0c;简而言之&#xff0c;是企业或组织主动邀请媒体参与某个事件或活动&#xff0c;如新闻发布会、新产品发布、开业庆典等&#xff0c;目的是希望媒体报道并传播这些消…

CentOS 8 通过YUM方式升级最新内核

CentOS 8 通过YUM方式升级最新内核 查看当前内核 uname -r 4.18.0-193.6.3.el8_2.x86_64导入 ELRepo 仓库的公钥&#xff1a; rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org安装升级内核相关的yum源仓库(安装 ELRepo 仓库的 yum 源) yum install https://www…

远程连接PostgreSQL:配置指南与安全建议

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

use vscode mingw cmake on windows

记住mingw去官网下面的MingW-W64-builds, 下这个版本 x86_64-13.1.0-release-posix-seh-ucrt-rt_v11-rev1.7z posix很重要, win32版本没线程支持,用到会报错 可以测试下是否能正常运行 #include <thread> #include <mutex> #include <condition_variable> …

MFC-GetAdaptersAddresses获取网卡信息

需要:#pragma comment(lib, "IPHLPAPI.lib") GetAdaptersAddresses函数参数说明 ULONG bufferSize = 0;ULONG result = ::GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, nullptr, nullptr, &bufferSize);/*参数1:ULONG Family 网络协议族,此参…

Android学习之路(14) Context详解

一. 简介 在 Android 开发中、亦或是面试中都离不开四大组件的身影&#xff0c;而在创建或启动这些组件时&#xff0c;并不能直接通过 new 关键字后跟类名来创建实例对象&#xff0c;而是需要有它们各自的上下文环境&#xff0c;也就是本篇文章要讨论的 Context。 1.1 Contex…

get_views中list的arch格式

1 日历 -> 会议 <tree string"会议" sample"1" multi_edit"1"><header><button name"action_open_composer" type"object" context"{composition_mode:mass_mail}" string"发送邮件"…

无穷级数几个基础知识

问题&#xff1a; 级数敛散性和积分敛散性的区别联系是什么&#xff1f;学习的目的是什么&#xff1f;最重要的目的是什么&#xff1f; 主要内容。 部分和 s ∑ i 1 n u i s \sum_{i1}^{n} u _{i} si1∑n​ui​ 注意&#xff1a;部分和不是数列的一部分之和&#xff0c;…

线性回归方程

性回归是利用数理统计中的回归分析来确定两种或两种以上变数间相互依赖的定量关系的一种统计分析方法&#xff0c;是变量间的相关关系中最重要的一部分&#xff0c;主要考查概率与统计知识&#xff0c;考察学生的阅读能力、数据处理能力及运算能力&#xff0c;题目难度中等&…

华为python面试题目

华为Python常见的面试问题包括: Python是如何被解释的?什么是PEP8?Python是怎样管理内存的?什么是Python装饰器?Python提供哪些内置类型?Python中的异常处理是怎样的?什么是Python的上下文管理器?Python中的列表推导式是什么?Python中的生成器是什么?什么是Python的装…

uniapp 下拉框数据回显的问题

问题 : 现在是下拉框数据回显不了, 绑定的v-model 原因 : uniui 下拉框数据绑定要是 value text 这种格式的 解决办法: 将获取到的后端数据 转换为 需要的格式 ,再进行绑定 下拉框的数据 遍历

Chinese-LLaMA-Alpaca-2模型的测评

训练生成效果评测 Fastchat Chatbot Arena推出了模型在线对战平台&#xff0c;可浏览和评测模型回复质量。对战平台提供了胜率、Elo评分等评测指标&#xff0c;并且可以查看两两模型的对战胜率等结果。生成回复具有随机性&#xff0c;受解码超参、随机种子等因素影响&#xff…