SpringMVC之JSON返回及异常处理

news2024/11/27 15:51:58

目录

JSON处理

导入依赖

 配置Spring-mvc.xml

 @ResponseBody注解使用

 测试

目录

JSON处理

导入依赖

 配置Spring-mvc.xml

 @ResponseBody注解使用

 测试

 Jackson 

定义

用法

常用注解

统一异常处理 

为什么要全局异常处理?

异常处理思路

SpringMVC异常分类 

综合案例 

异常处理方式一

异常处理方式二 

异常处理方式三


 Jackson 

定义

用法

常用注解

统一异常处理 

为什么要全局异常处理?

异常处理思路

SpringMVC异常分类 

综合案例 

异常处理方式一

异常处理方式三


JSON处理

导入依赖

<!--    JSON数据返回-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>${jackson.version}</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>${jackson.version}</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>${jackson.version}</version>
    </dependency>

 配置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>

 @ResponseBody注解使用

@ResponseBody是一个Spring MVC注解,用于指示方法返回的值应该被序列化为HTTP响应的正文。它被添加到控制器方法中,并告诉Spring MVC框架不要将方法的返回值解释为视图名称或模型数据。相反,该注解告诉Spring MVC将返回值直接写入HTTP响应正文中,这通常是JSON或XML格式。

 创建一个JsonController类

package com.xiaoxu.web;

import com.xiaoxu.biz.BookxxBiz;
import com.xiaoxu.exception.GlobalException;
import com.xiaoxu.model.Bookxx;
import com.xiaoxu.utis.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 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
@RequestMapping("/clz/json")
public class JsonController {
    @Autowired
    private BookxxBiz bookxxBiz;

    /**
     * 返回List<T>
     * @param req
     * @param bookxx
     * @return
     */
//    @ResponseBody
    @RequestMapping("/list")
    public List<Bookxx> list(HttpServletRequest req, Bookxx bookxx){
        PageBean pageBean = new PageBean();
        pageBean.setRequest(req);
        List<Bookxx> lst = this.bookxxBiz.selectPage(bookxx, pageBean);
        System.out.println(1 / 0);
        return lst;
    }


    /**
     * 返回T
     * @param req
     * @param bookxx
     * @return
     */
//    @ResponseBody
    @RequestMapping("/load")
    public Bookxx load(HttpServletRequest req, Bookxx bookxx){
        if(bookxx.getBook_id() != null){
            List<Bookxx> lst = this.bookxxBiz.selectPage(bookxx, null);
            return lst.get(0);
        }
        return null;
    }


    /**
     * 返回List<Map>
     * @param req
     * @param bookxx
     * @return
     */
//    @ResponseBody
    @RequestMapping("/mapList")
    public List<Map> mapList(HttpServletRequest req, Bookxx bookxx){
        PageBean pageBean = new PageBean();
        pageBean.setRequest(req);
        List<Map> lst = this.bookxxBiz.mapListPager(bookxx, pageBean);
        return lst;
    }

    /**
     * 返回Map
     * @param req
     * @param bookxx
     * @return
     */
//    @ResponseBody
    @RequestMapping("/mapLoad")
    public Map mapLoad(HttpServletRequest req, Bookxx bookxx){
        if(bookxx.getBook_id() != null){
            List<Map> lst = this.bookxxBiz.mapListPager(bookxx, null);
            return lst.get(0);
        }
        return null;
    }


//    @ResponseBody
    @RequestMapping("/all")
    public Map all(HttpServletRequest req, Bookxx bookxx){
        PageBean pageBean = new PageBean();
        pageBean.setRequest(req);
        List<Bookxx> lst = this.bookxxBiz.selectPage(bookxx, pageBean);
        Map map = new HashMap();
        map.put("lst",lst);
        map.put("pageBean",pageBean);
        return map;
    }

//    @ResponseBody
    @RequestMapping("/jsonStr")
    public String jsonStr(HttpServletRequest req, Bookxx bookxx){
        System.out.println("-----------------------------");
        if(true)
        throw new GlobalException("沸羊羊,你个臭傻逼");
        return "clzEdit";
    }


}

然后在MusicBiz中添加以下代码

 List<Map> mapListPager(Bookxx bookxx, PageBean pageBean);

再在impl类中实现该接口

@Override
    public List<Map> mapListPager(Bookxx bookxx,PageBean pageBean) {
       bookxx = null;
        System.out.println(bookxx.getBook_name());
        return bookxxMapper.mapListPager(bookxx,pageBean);
    }

  然后根据实现的方法在逆向生成的musicMapper中添加

List<Map> mapListPager(Bookxx bookxx, PageBean pageBean);

bookxxMapper.xml

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

  </where>
</select>

 测试

 Jackson 

定义

Jackson"通常指代Jackson库,它是一个用于处理JSON数据的流行Java库。Jackson库提供了一组API和工具,用于将Java对象转换为JSON格式,并提供了从JSON到Java对象的反向转换功能。

使用Jackson库,你可以轻松地在Java应用程序中进行JSON的序列化和反序列化操作。它提供了各种功能和配置选项,例如支持不同的数据绑定策略、处理复杂对象、处理日期和时间等等。Jackson广泛应用于Java Web应用、RESTful API开发和其他需要处理JSON数据的项目中。

总之,Jackson是一个强大而灵活的Java库,用于在Java应用程序中处理JSON数据。通过使用Jackson,开发人员可以方便地进行JSON序列化和反序列化操作,从而简化了与JSON数据的交互。

用法

 使用Jackson需要在SpringMVC中添加Jackson依赖,并配置JacksonMessageConverter。JacksonMessageConverter是SpringMVC中的一个消息转换器,用于将Java对象转换为JSON数据和将JSON数据转换为Java对象。

 Jackson还支持注解,例如@JsonProperty和@JsonView,可以帮助控制序列化和反序列化的行为。总的来说,Jackson是一个强大的Java库,可以使SpringMVC应用程序更方便地处理和传输数据。

常用注解

1. @JsonFormat:格式化输出日期类型的值

2. @JsonInclude:控制序列化过程中包含哪些属性

3. @JsonIgnore:忽略某些属性

4. @JsonProperty:指定属性的名称

5. @JsonView:根据视图序列化对象

6. @JsonManagedReference和@JsonBackReference:解决对象循环引用的问题

7. @JsonIdentityInfo:为对象设置唯一标识

8. @JsonTypeInfo:序列化和反序列化时带上类型信息

9. @JsonAutoDetect:指定序列化和反序列化过程中哪些属性可见

10. @JsonCreator:定义一个构造函数用于反序列化

11. @JsonAnyGetter和@JsonAnySetter:序列化和反序列化时动态处理属性

统一异常处理 

为什么要全局异常处理?

Java 中的全局异常处理是指在程序中统一处理所有的异常,而不是在每个方法中单独处理异常。使用全局异常处理可以提高代码的可读性和可维护性,减少代码冗余,避免重复代码。此外,全局异常处理可以将异常信息统一记录到日志中,方便后续的问题排查和分析。如果不使用全局异常处理,在出现异常时,程序可能会直接终止,用户体验也会受到影响。因此,在 Java 中使用全局异常处理是一个好的编程实践。

异常处理思路

SpringMVC异常分类 

1. 控制器方法异常:当控制器方法抛出异常时,SpringMVC会将异常信息包装成一个特殊的响应对象返回给客户端。

2. 数据转换异常:当SpringMVC无法将请求参数转换成对应类型的数据时,会抛出数据转换异常。

3. 数据验证异常:当请求参数不符合预定的验证规则时,会抛出数据验证异常。

4. 消息转换异常:当SpringMVC无法将响应数据转换成客户端需要的类型时,会抛出消息转换异常。

5. 文件上传异常:当文件上传过程中出现问题时,会抛出文件上传异常。

6. MVC配置异常:当SpringMVC配置出现问题时,会抛出MVC配置异常。

7. 未处理的异常:当SpringMVC中出现未处理的异常时,会抛出未处理的异常。

综合案例 

异常处理方式一

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>
</beans>

 新建一个errpr.jsp用来展示异常效果

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
错误信息页面。。。。。。。。。。。。。。
<hr>
${ex}
<hr>
${msg}
</body>
</html>

 然后造一个错误数据

  @RequestMapping("/list")
    public List<Bookxx> list(HttpServletRequest req, Bookxx bookxx){
        PageBean pageBean = new PageBean();
        pageBean.setRequest(req);
        List<Bookxx> lst = this.bookxxBiz.selectPage(bookxx, pageBean);
        System.out.println(1 / 0);
        return lst;
    }

测试 

异常处理方式二 

首先在异常包中定义一个全局异常的类

 异常类代码

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

创建一个全局异常处理类

package com.xiaoxu.component;

import com.xiaoxu.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
    @ExceptionHandler
    public 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数据
    @ResponseBody
    @ExceptionHandler
    public 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;
    }

 

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

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

相关文章

java基础-基础知识点

文章目录 jdk目录结构函数式接口wait、notify、notifyAll 并发编程Threadsleep、yield、joindaemon &#xff08;守护线程&#xff09; 锁[synchronized ](https://blog.csdn.net/EnjoyFight/article/details/127457876)线程池 jdk目录结构 jdk1.8 jdk20 函数式接口 http…

PyTorch之张量的相关操作大全 ->(个人学习记录笔记)

文章目录 Torch1. 张量的创建1.1 直接创建1.1.1 torch.tensor1.1.2 torch.from_numpy(ndarray) 1.2 依据数值创建1.2.1 torch.zeros1.2.2 torch.zeros_like1.2.3 torch.ones1.2.4 torch.ones_like1.2.5 torch.full1.2.6 torch.full_like1.2.7 torch.arange1.2.8 torch.linspace…

快速安装Redis以及配置Redis集群

Redis集群 本章是基于CentOS7下的Redis集群教程&#xff0c;包括&#xff1a; 单机安装RedisRedis主从Redis分片集群 1.单机安装Redis 首先需要安装Redis所需要的依赖&#xff1a; yum install -y gcc tcl#docker安装redis #1、docker pull redis#2、docker run --name my…

如何搭建一款BI系统

一、BI系统介绍 1.1 什么是BI系统 BI的英文全拼是Business Intelligence&#xff0c;商业智能&#xff0c;简称BI。我们经常能听到企业说“上BI”、“建设BI系统”、“构建BI决策平台”等内容。那么BI到底是什么呢&#xff1f; (1) 最初起源于固定报表 在几十年前&#xff…

【网络编程】深入理解TCP协议一(三次握手四次挥手、标记位、确认应答机制、超时重传机制)

TCP协议 1.三次握手四次挥手2.TCP协议段格式3.标记位介绍4.确认应答机制5.超时重传机制 1.三次握手四次挥手 当客户端发起连接请求时&#xff0c;SYN需要被设置位1&#xff0c;告诉服务器客户端希望建立一个链接服务器收到响应之后会回复 SYNACK&#xff0c;表示确认了客户端地…

Hum Brain Mapp:皮质脑-心轴的微状态

摘要 脑电图(EEG)微状态是具有准稳态头皮地形的大脑状态。这种状态是否会延伸到身体层面(即外周自主神经系统)目前尚不清楚。假设微状态作为一种中枢自主神经网络的功能状态会延伸到脑-心轴水平。因此&#xff0c;本研究结合了EEG和心跳动力学序列来估计起源于皮层的定向信息传…

第35章_瑞萨MCU零基础入门系列教程之ADXL345三轴传感器驱动实验

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…

虹科案例 | Zuellig Pharma和ELPRO通过符合GDP标准的温度监测和高效的温度数据管理为未来发展奠定基础

在本案例研究中&#xff0c;您将了解Zuellig Pharma 实施了温度监测解决方案&#xff0c;以一致的数据结构获取各国和各种运输方式的数据; 通过将温度数据上传到其数据库管理系统&#xff0c;显著提高了其效率; 并建立了为未来管理决策提供数据增值使用的基础。 项目合作伙伴 …

《AI新时代:大一新生如何快速入门IT专业?》

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

《使用AADL的模型基工程》读书笔记(一)

1. 什么是模型基工程&#xff1f; 模型基工程(Model-Based Engineering&#xff0c;MBE)旨在建立和分析系统模型&#xff0c;这样就能够预测和了解该系统的能力和工作质量属性 (如性能、可靠性或信息安全性)。在系统集成和验收试验之前&#xff0c;很难发现一些系统级的问题&a…

【数据结构】——排序算法的相关习题

目录 一、选择题题型一 &#xff08;插入排序&#xff09;1、直接插入排序2、折半插入排序3、希尔排序 题型二&#xff08;交换排序&#xff09;1、冒泡排序2、快速排序 题型三&#xff08;选择排序&#xff09;1、简单选择排序~2、堆排序 ~题型四&#xff08;归并排序&#xf…

测试平台项目部署二(手动部署改成Dockerfile)

测试平台项目部署二(手动部署改成Dockerfile) 一、Dockerfile制作1、entrypoint.sh制作2、构建镜像3、启动容器二、遇到的问题1、pip install --no-cache-dir -r requirements.txt安装第三方库时,报Installing build dependencies: started2、安装第三方库文件比较慢,考虑更…

可以在图片上编辑文字的软件推荐?来试试这几款

在图片上编辑文字的优势之一是可以更好地传达信息。有时候&#xff0c;图片本身可能不足以清楚地说明重点&#xff0c;但是添加文字可以强调或澄清要点。此外&#xff0c;对于社交媒体等视觉重要的平台&#xff0c;图像上的文字可以更好地吸引用户的注意力和交流。那么有哪些可…

TypeScript类型兼容:结构化类型

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 1. 鸭子类型&#xff1a;定义和示例 2. 鸭子类型的优点 2.1 代码的灵活性 2.2 代码的复用 2.3 与 JavaScript 的…

ACM模板二:树、图、并查集、DancingLink

目录 〇&#xff0c;全文说明、宏定义代码 一&#xff0c;二叉树 二&#xff0c;树状数组、线段树 三&#xff0c;多叉树 四&#xff0c;并查集、DancingLink、无向图、最小生成树 五&#xff0c;有向图、单源最短路径、连通分量、拓扑排序 六&#xff0c;网格图、回路链…

关于 Resolution(分辨率、解析力)各单位的意义及相互之间的换算

1、问题背景 最近在调试的项目&#xff0c;有关于对解析力的要求&#xff0c;用 imatest 软件测试 MTF50 的值&#xff0c;如下图所示&#xff0c;可以看到他有不同的单位表示&#xff0c;LW/PH、Cycles/pixel 。另外关于解析力的单位还有LP/mm、L/mm、Cycles/mm、LP/PH&#…

学生护眼灯用白炽灯还是led?专业的学生护眼灯推荐

现在的护眼灯逐渐成为了孩子们学习路上必不可少的一盏灯具&#xff0c;它比普通的台灯光线更加均匀舒适&#xff0c;而且更加护眼。因此也成为了家长们呵护孩子视力健康的一大“帮手”&#xff0c;不过护眼台灯的种类也有很多&#xff0c;最近就有家长问孩子使用的护眼灯是白炽…

用GPT干的18件事,能够真正提高学习生产力,建议收藏

用GPT干的18件事&#xff0c;能够真正提高学习生产力&#xff0c;建议收藏。 语法更正 文本翻译 语言转换 代码解释 修复代码错误 作为百科全书 信息提取 好友聊天 创意生成器 采访问题 论文大纲 故事创作 问题类比 创建 SQL 需求 情感分析 将产品描述转变为广告 关键字提取 闲…

Tailwind CSS 初学者指南

Tailwind CSS是一个实用程序优先的CSS框架&#xff0c;允许您快速构建现代网站&#xff0c;而无需离开HTML。它是 Web 开发社区中最流行和使用最广泛的 CSS 框架之一&#xff0c;每月下载量超过 250 万次1。在本文中&#xff0c;我们将探讨 Tailwind CSS 2023 的路线图&#xf…

go string类型简叙

字符串赋值后就不能修改 var str string "abcd" str[0] f //这里就有能修改str内容字符串的两种表示形式 双引号&#xff0c;会识别转义字符反引号&#xff0c;以字符串的原生形式输出&#xff0c;包括换行和特殊字符&#xff0c;可以实现防止攻击、输出输出源代…