Spring Boot-3

news2024/11/24 9:44:24

学习笔记(今天又读了好多篇的博客,做个今天的总结,加油!!!)

PS:快到中伏了,今天还是好热

使用阿里巴巴 FastJson 的设置

1、jackson 和 fastJson 的对比

有很多人已经习惯于使用阿里巴巴的 fastJson 来做项目中 json 转换的相关工作,比如目前项目中使用的就是阿里的 fastJson
在这里插入图片描述

关于 fastJson 和 jackson 的对比,网上有很多资料可以查看,主要是根据自己实际项目情况来选择合适的框架。

从扩展上来看,fastJson 没有 jackson 灵活,从速度或者上手难度来看,fastJson 可以考虑,项目中目前使用的是阿里的 fastJson,挺方便的。

2、 fastJson 依赖导入

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
</dependency>

3 、使用 fastJson 处理 null

使用 fastJson 时,对 null 的处理和 jackson 有些不同,需要继承 WebMvcConfigurationSupport 类或者实现

WebMvcConfiguration 接口,然后覆盖 configureMessageConverters 方法,在方法中可以选择对要实现 null转换的场景,配置好即可。

@Configuration
public class fastJsonConfig extends WebMvcConfigurationSupport {
//使用阿里 FastJson 作为 JSON MessageConverter
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        config.setSerializerFeatures(
            SerializerFeature.WriteMapNullValue, // 保留 map 空的字段
            SerializerFeature.WriteNullStringAsEmpty, // 将 String 类型的 null 转成"" SerializerFeature.WriteNullNumberAsZero, // 将 Number 类型的 null 转成 0
            SerializerFeature.WriteNullListAsEmpty, // 将 List 类型的 null 转成[]
            SerializerFeature.WriteNullBooleanAsFalse, // 将 Boolean 类型的 null 转成 false
            SerializerFeature.DisableCircularReferenceDetect); // 避免循环引用
        converter.setFastJsonConfig(config);
        converter.setDefaultCharset(Charset.forName("UTF-8"));
        List<MediaType> mediaTypeList = new ArrayList<>();
// 解决中文乱码问题,相当于在 Controller 上的@RequestMapping 中加了个属性 produces ="application/json" 
        mediaTypeList.add(MediaType.APPLICATION_JSON);
        converter.setSupportedMediaTypes(mediaTypeList);
        converters.add(converter);
    }
}

测试工具 postman

@PostMapping
public String create(@RequestBody User user){
    //@RequestBody要求传入的数据必须为json
    boolean bb = userService.create(user);
    if(bb)
        return "success"
    return "failure";
}

如果直接测试,则需要编写页面和 js 代码才能进行验证,可以使用postman 避免这些繁琐的操作

在这里插入图片描述

这里针对日期类型数据的格式转换会有报错。最终提交数据为

{“username”:“谢逊”,“sex”:“true”,“birth”:“1989-02-03”,“password”:“666666”}

4、封装统一返回的数据结构

在实际项目中,除了要封装数据之外,往往需要在返回的 json 中添加一些其他信息,比如返回一些状态码 code【注意不是 response 的响应状态码】,返回一些 msg 给调用者,这样调用者可以根据 code 或者 msg 做一些逻辑判断。所以在实际项目中,需要封装一个统一的 json 返回结构存储返回信息。

4.1 定义统一的 json 结构

由于封装的 json 数据的类型不确定,所以在定义统一的 json 结构时需要用到泛型。统一的 json 结构中属性包括数据、状态码、提示信息即可,构造方法可以根据实际业务需求做相应的添加即可,一般来说,应该有默认的返回结构,也应该有用户指定的返回结构。

public class JsonResult<T> {
    private T data; //需要传递的数据
    private int code; 
//用户自定义相应码,注意不是服务器响应状态码。
//如果不需要传递详细信息还可以使用 boolean success;
    private String msg; // 服务器回传信息
    public JsonResult() { 
//若没有数据返回,默认状态码为 0,提示信息为:操作成功!
        this.code = 0;
        this.msg = "操作成功!";
    }
    public JsonResult(int code, String msg) { //若没有数据返回,可以人为指定状态码和提示信息
        this.code = code;
        this.msg = msg;
    }
    public JsonResult(T data) { 有数据返回时,状态码为 0,默认提示信息为:操作成功!
        this.data = data;
        this.code = 0;
        this.msg = "操作成功!";
    }
    public JsonResult(T data, String msg) { 有数据返回,状态码为 0,人为指定提示信息
        this.data = data;
        this.code = 0;
        this.msg = msg;
    }
    // 省略 get 和 set 方法
}

建议写法,不一定最佳

@Data
public class JsonReault implements Serializable{
    private Boolean success;
    private Integer code;
    private Object data;
    private String message;
}

4.2 修改 Controller 中的返回值类型及测试

由于 JsonResult 使用了泛型,所以所有的返回值类型都可以使用该统一结构,在具体的场景将泛型替换成具体的数据类型即可,非常方便,也便于维护。在实际项目中,还可以继续封装,比如状态码和提示信息可以定义一个枚举类型,以后只需要维护这个枚举类型中的数据即可。根据以上的 JsonResult 可以改写一下 Controller

@RestController
@RequestMapping("/jsonresult")
public class JsonResultController {
    @RequestMapping("/user")
    public JsonResult<User> getUser() {
        User user = new User(1, "羊羊", "123456");
        return new JsonResult<>(user);
    }
    @RequestMapping("/list")
    public JsonResult<List> getUserList() {
        List<User> userList = new ArrayList<>();
        User user1 = new User(1, "羊羊", "123456");
        User user2 = new User(2, "小灰灰", "123456");
        userList.add(user1);
        userList.add(user2);
        return new JsonResult<>(userList, "获取用户列表成功");
    }
    @RequestMapping("/map")
    public JsonResult<Map> getMap() {
        Map<String, Object> map = new HashMap<>(3);
        User user = new User(1, "羊羊", null);
        map.put("作者信息", user);
        map.put("博客地址", "http://blog.yang.com");
        map.put("CSDN 地址", null);
        map.put("粉丝数量", 4153);
        return new JsonResult<>(map);
    }
}  

重新在浏览器中输入:localhost:8080/jsonresult/user 返回 json:

{“code”:0,“data”:{“id”:1,“password”:“123456”,“username”:“羊羊”},“msg”:“操作成功!”}

输入:localhost:8080/jsonresult/list,返回 json 格式:

{“code”:0, “data”:[{“id”:1, “password”:“123456”, “username”:" 羊羊 "}, {“id”:2, “password”:“123456”,“username”:“小灰灰”}], “msg”:“获取用户列表成功”}

输入:localhost:8080/jsonresult/map,返回 json 格式:

{“code”:“0”, “data”:{“作者信息”:{“id”:1, “password”:“”,“username”:“羊羊”},“CSDN 地址”:null,"粉丝数量

":4153,“博客地址”:“http://blog.yang.com”},“msg”:“操作成功!”}

通过封装,不但将数据通过 json 传给前端或者其他接口,还带上了状态码和提示信息,这在实际项目场景中应用非常广泛。
在这里插入图片描述

总结

这里主要是对 Spring Boot 中 json 数据的返回做了详细的分析,从 Spring Boot 默认的 jackson 框架到阿里的fastJson 框架,分别对它们的配置做了相应的描述。另外,结合实际项目情况,总结了实际项目中使用的 json封装结构体,加入了状态码和提示信息,使得返回的 json 数据信息更加完整。

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

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

相关文章

spmvc基本要求

Mvc第一天 今天目标就是将所有的接口相关的注解理解,并且所有的注解都举例写出代码(cdsn上查) 1 mvc的基本概念: mvc: model,view,Controller,简单解释就是模型,视图,控制器.面试会问,md文档这些描述很到位,你可以看看 2 接口注解: (1) Controller/RestController表示当前…

【100天精通python】Day12:面向对象编程_属性和继承的基本语法与示例

目录 1 属性&#xff08;Attributes&#xff09; 1.1 属性的基本语法 1.2 创建用于计算的属性 1.3 属性的安全保护机制 2 继承&#xff08;Inheritance&#xff09; 2.1 继承的基本语法 2.2 方法的重写 2.3 派生类中调用基类的_init_()方法 3 总结 属性是类的特征或数…

记录WordPress安装后我常用的插件

记录WordPress安装后我常用的插件 一、WordPress安装二、插件使用1.添加Astra主题2.Easy Updates Manager2.WP Githuber MD3.WP-Optimize – Cache, Clean, Compress4. WP-PostViews或Post Views Counter5. Easy Table of Contents5. UpdraftPlus Backup/Restore6.WP Super Cac…

【开源项目】低代码数据可视化开发平台-Datav

Datav 基本介绍 Datav是一个Vue3搭建的低代码数据可视化开发平台&#xff0c;将图表或页面元素封装为基础组件&#xff0c;无需编写代码即可完成业务需求。 它的技术栈为&#xff1a;Vue3 TypeScript4 Vite2 ECharts5 Axios Pinia2 在线预览 账号: admin 密码: 123123预…

4.1 Bootstrap UI 编辑器

文章目录 1. Bootstrap Magic2. BootSwatchr3. Bootstrap Live Editor4. Fancy Boot5. Style Bootstrap6. Lavish7. Bootstrap ThemeRoller8. LayoutIt!9. Pingendo10. Kickstrap11. Bootply12. X-editable13. Jetstrap14. DivShot15. PaintStrap 以下是 15 款最好的 Bootstrap…

Zabbix监控安装grafana并配置图形操作

第三阶段基础 时 间&#xff1a;2023年7月20日 参加人&#xff1a;全班人员 内 容&#xff1a; Zabbix监控安装grafana 目录 安装并配置grafana 一、安装Grafana 二、下载安装插件 三、配置grafana 四、Web访问并配置&#xff1a; 安装并配置grafana 一、安装Graf…

微服务之服务注册与发现原理

1. 前言 在传统的开发中&#xff0c;由于提供服务的地址是相对静态的&#xff0c;所以我们只需要找到对应服务的开发人员&#xff0c;然后了解到对应的服务接口地址就可以了。 而在微服务架构开发过程中&#xff0c;如果我们需要调用一个RESTFul风格的API接口&#xff0c;我们…

deep a wavelet 深度自适应小波网络

深度自适应小波网络 1.  原理说明 1.1 the Lifting scheme 提升方案&#xff0c;也称为第二代小波[25]&#xff0c;是定义与第一代小波[6]具有相同属性的小波的一种简单而强大的方法。 提升方案将信号x作为输入&#xff0c; 生成小波变换的近似分量C, 和细节分量d 这两类…

网络安全基础知识解析:了解常见的网络攻击类型、术语及其防范方法

目录 1、网络安全常识和术语 1.1资产 1.2网络安全 1.3漏洞 1.4 0day 1.5 1day 1.6后门 1.7exploit 1.8攻击 1.9安全策略 1.10安全机制 1.11社会工程学 2、为什么会出现网络安全问题&#xff1f; 2.1网络的脆弱性 2.4.1缓冲区溢出攻击原理&#xff1a; 2.4.2缓冲…

NLP(六十一)使用Baichuan-13B-Chat模型构建智能文档问答助手

在文章NLP&#xff08;六十&#xff09;Baichuan-13B-Chat模型使用体验中&#xff0c;我们介绍了Baichuan-13B-Chat模型及其在向量嵌入和文档阅读上的初步尝试。   本文将详细介绍如何使用Baichuan-13B-Chat模型来构建智能文档问答助手。 文档问答流程 智能文档问答助手的流…

手机+App=电脑静音无线鼠标 - WiFimouse初体验

应用情景 大晚上的别人在睡觉&#xff0c;自己又不得不使用电脑&#xff08;台式&#xff09;&#xff0c;鼠标点点点又吵。 专门买个静音鼠标又没钱&#xff0c;咋办~ 效果图 手机app 电脑无线触控板&#xff0c;零噪音&#xff01; 可以单击、移动鼠标光标、可以上下滚动…

什么是Redis?

什么是Redis 什么是Redis一、特性1. 支持多种数据结构2. 读/写速度快&#xff0c;性能高。3. 支持持久化。4. 实现高可用主从复制&#xff0c;主节点做数据副本。5. 实现分布式集群和高可用。 二、基本数据类型string&#xff08;字符串&#xff09;list(双向链表)set(集合)zse…

22matlab数据分析 拉格朗日插值(matlab程序)

1.简述 第一部分&#xff1a;问题分析 &#xff08;1&#xff09;实验题目&#xff1a;拉格朗日插值算法 具体实验要求&#xff1a;要求学生运用拉格朗日插值算法通过给定的平面上的n个数据点&#xff0c;计算拉格朗日多项式Pn(x)的值&#xff0c;并将其作为实际函数f(x)的估…

文心千帆为你而来

1. 前言 3月16号百度率先发布了国内第一个人工智能大语言模型—文心一言。文心一言的发布在业界引起了不小的震动。而文心一言的企业服务则由文心千帆大模型平台提供。文心千帆大模型平台是百度智能云打造出来的一站式大模型开发与应用平台&#xff0c;提供包括文心一言在内的…

文件被识别为病毒,被删除,如何解决

我们的文件有时候有用&#xff0c;但是电脑却识别为病毒&#xff0c;直接给我删除掉了&#xff0c;这让人是真的很XX&#xff0c;那该怎么办呐。 我最近用了这个方法很多次&#xff0c;蛮好用&#xff0c;分享给大家&#xff01; 1、先找到安全中心 2、找不到排除项 3、点击添…

工程矩阵理论复习线路推荐

文章目录 写在前面复习线路推荐前期中期后期其他资料 写在前面 本篇博客仅适用于东南大学研究生 工程矩阵理论科目复习 对不少人来说&#xff0c;研究生的课程成绩相较于本科成绩不是那么重要了。但是由于工程矩阵还是比较有难度的&#xff0c;又很长时间没接触过数学&#x…

7-22练习

题目1 链接5071 不难发现通过A的范围可以缩小B的范围进而减少循环次数 通过B可以消除A的循环 这个是一个很巧妙的地方。这个题还有一个比较容易引起歧义的地方就是i:n每一次循环都要符合条件 这样我们不难构造出一个函数 f(B+x) = 1000*A+x 试验1 运行超时-- 需要减少复杂度…

时钟分频器

文章目录 一、8分频二、n倍时钟分频器 一、8分频 8倍时钟分频器是一种电路或设备&#xff0c;用于将输入时钟信号的频率分成原来的1/8。它可以在数字电子系统中用于将高频时钟信号降低到较低的频率&#xff0c;以满足特定的系统需求。 在这个电路中&#xff0c;CLK是输入的时钟…

【晓风残月】byte,short,int,long——八种基本类型

文章目录 前言废话不多说&#xff0c;总结下今天的成果以及踩的坑 一、第一个坑【数据丢失】二、第二个坑【byte集合无法转换byte数组】三、第三个坑【Byte[]转byte[]】四、第四个坑【16进制转byte】总结快一年没写博客了&#xff0c;貌似都不记得过去的自己了向前看&#xff1…

Camtasia2023电脑录屏视频自动生成字幕软件

制作视频通常需要添加字幕&#xff0c;添加字幕比较麻烦的是让字幕和声音同步&#xff0c;使用好的软件可以大大提高剪辑效率&#xff0c;让视频更快制作完成。本文将给大家介绍录制视频自动生成字幕的软件设置字幕语音同步教程。 一、录屏视频自动生成字幕的软件 Camtasia是…