Spring Boot学习笔记(一)

Spring Boot学习笔记(一)构建第一个Spring Boot项目 构建第一个Spring Boot项目 Spring Boot入门介绍: BUILD ANYTHING. Spring Boot is designed to get you up and running as quickly as possible, with minimal upfront configuration of Spring. Spring Boot takes an opini... 阅读详情

@RestController注解与JSON相关

@RestController 也是 Spring Boot 新增的一个注解,在项目开发中,接口与接口之间,前后端之间数据的传输都使用 Json 格式,在 Spring Boot 中,接口 返回 Json 格式的数据很简单,在 Controller 中使用 @RestController 注解即可返回 Json 格式的数据。

@Target({ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Controller 
@ResponseBody 
public @interface RestController {    
	String value() default ""; 
}

可以看出, @RestController 注解包含了原来的@Controller 和 @ResponseBody 注解,使用过 Spring 的朋友对 @Controller 注解已经非常了解了,这里不再赘述, @ResponseBody 注解是将返回 的数据结构转换为 Json 格式。所以在默认情况下,使用了 @RestController 注解即可将返回的数据 结构转换成 Json 格式,Spring Boot 中默认使用的 Json 解析技术框架是 jackson。
点开 pom.xml 中的 spring-boot-starter-web 依赖,可以看到一个 spring-boot-starter-json 依赖:

<dependency>    
<groupId>org.springframework.boot</groupId>    
<artifactId>spring-boot-starter-json</artifactId>    
<version>2.0.3.RELEASE</version>    
<scope>compile</scope> 
</dependency>

次点进去上面这个 spring-boot-starter-json 依赖,可以看到:
在这里插入图片描述

1. Spring Boot 默认对Json的处理

在实际项目中,常用的数据结构无非有类对象、List对象、Map对象,我们看一下默认的 jackson 框架 对这三个常用的数据结构转成 json 后的格式如何。
1.1创建测试实体类

public class User {    
	private Long id;    
	private String username;   
	private String password;    
 /* 省略get、set和带参构造方法 */
  }

1.2创建controller类

@RestController
@RequestMapping("/json")
public class JsonController {
    @RequestMapping("/user")
    public User getUser() {
        return new User(1l, "coder", "123456");
    }
    @RequestMapping("/list")

    public List<User> getUserList() {
        List<User> userList = new ArrayList<>();
        User user1 = new User(1l, "coderfeng", "123456");
        User user2 = new User(2l, "fengcoder", "123456");
        userList.add(user1);
        userList.add(user2);
        return userList;
    }
    @RequestMapping("/map")
    public Map<String, Object> getMap() {
        Map<String, Object> map = new HashMap<>(3);
        User user = new User(1l, "coderwang", "123456");
        map.put("作者信息", user);
        map.put("博客地址", "https://blog.youkuaiyun.com/CodersCoder");
        map.put("优快云地址", "https://blog.youkuaiyun.com/CodersCoder");
        map.put("粉丝数量", 0);
        return map;
    }
}

1.3测试不同数据类型返回的json
写好了接口,分别返回了一个 User 对象、一个 List 集合和一个 Map 集合,其中 Map 集合中的value 存的是不同的数据类型。接下来我们依次来测试一下效果。
在浏览器中输入: localhost:8080/json/user 返回 json 如下:

{“id”:1,“username”:“coder”,“password”:“123456”}

在浏览器中输入: localhost:8080/json/list 返回 json 如下:

[{“id”:1,“username”:“coderfeng”,“password”:“123456”},{“id”:2,“username”:“fengcoder”,“password”:“123456”}]

在浏览器中输入: localhost:8080/json/map 返回 json 如下:

{“作者信息”:{“id”:1,“username”:“coderwang”,“password”:“123456”},“优快云地址”:“https://blog.youkuaiyun.com/CodersCoder”,“粉丝数量”:0,“博客地址”:“https://blog.youkuaiyun.com/CodersCoder”}

1.4对null的处理
我们难免会遇到一些 null 值出现,我们转 json 时,是不希望有这些 null 出现的,比如我们期望所有的 null 在转 json 时都变成 “” 这种空字符串,那怎么做呢?在 Spring Boot 中,我们做一下配置即可,新建一个 jackson 的配置类:

@Configuration
public class JacksonConfig {
    @Bean
    @Primary 
    @ConditionalOnMissingBean(ObjectMapper.class)
    public ObjectMapper jsonObjectMapper(Jackson2ObjectMapperBuilder builder){
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();
        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
            @Override
            public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
                jsonGenerator.writeString("");
            }
        });
        return objectMapper;
    }
}

更改上面map的例子,将博客地址改为null,重启项目,并且输入localhost:8080/json/map查看结果:

@RequestMapping("/map")
    public Map<String, Object> getMap() {
        Map<String, Object> map = new HashMap<>(3);
        User user = new User(1l, "coderwang", "123456");
        map.put("作者信息", user);
        map.put("博客地址", null);
        map.put("优快云地址", "https://blog.youkuaiyun.com/CodersCoder");
        map.put("粉丝数量", 0);
        return map;
    }

{“作者信息”:{“id”:1,“username”:“coderwang”,“password”:“123456”},“优快云地址”:“https://blog.youkuaiyun.com/CodersCoder”,“粉丝数量”:0,“博客地址”:""}

可以看到,null已经转为空字符串了。

2. 使用阿里巴巴FastJson的设置

有很多朋友习惯于使用阿里巴巴的 fastJson 来做项目中 json 转换的相关工作,目前我们项目中使用的就是阿里的 fastJson,那么 jackson 和 fastJson 有哪些区别呢?根据网上公开的资料比较得到下表。
在这里插入图片描述
2.1fastJson依赖导入
以1.2.58为例

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

2.2fastJson处理null
使用 fastJson 时,对 null 的处理和 jackson 有些不同,需要继承 WebMvcConfigurationSupport类,然后覆盖 configureMessageConverters 方法,在方法中,我们可以选择对要实现 null 转换的场景,配置好即可。如下:

@Configuration
public class FastJsonConfigs extends WebMvcConfigurationSupport {
    @Override
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        config.setSerializerFeatures(
                // 保留map空的字段
                SerializerFeature.WriteMapNullValue,
                // 将String类型的null转成""
                SerializerFeature.WriteNullStringAsEmpty,
                // 将Number类型的null转成0
                SerializerFeature.WriteNullNumberAsZero,
                // 将List类型的null转成[]
                SerializerFeature.WriteNullListAsEmpty,
                // 将Boolean类型的null转成false
                SerializerFeature.WriteNullBooleanAsFalse,
                // 避免循环引用
                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);

    }
}

3. 封装统一返回的数据结构

在实际项目中,除了要封装数据之外,我们往往需要在返回的 json 中添加一些其他信息,比如返回一些状态码 code ,返回一些 msg 给调用者,这样调用者可以根据 code 或者 msg 做一些逻辑判断。所以在实际项目中,我们需要封装一个统一的json 返回结构存储返回信息。
3.1定义统一的 json 结构
由于封装的 json 数据的类型不确定,所以在定义统一的 json 结构时,我们需要用到泛型。统一的 json结构中属性包括数据、状态码、提示信息即可,构造方法可以根据实际业务需求做相应的添加即可,一般来说,应该有默认的返回结构,也应该有用户指定的返回结构。如下:

public class JsonResult<T> {
    private T data;
    private String code;
    private String msg;

    //没有数据返回,默认状态码为0000,msg为:success
    public JsonResult(){
        this.code="0000";
        this.msg="success";
    }

    //没有数据返回,可以人为指定状态码和提示信息
    public JsonResult(String code,String msg){
        this.code = code;
        this.msg = msg;
    }

    //有数据返回时,状态码为0000,msg为:success
    public JsonResult(T data){
        this.data = data;
        this.code = "0000";
        this.msg = "success";
    }

    //有数据返回,状态码为0000,人为指定提示信息
    public JsonResult(String msg){
        this.data = data;
        this.code = "0000";
        this.msg = msg;
    }


    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
}

3.2 创建测试Controller 中的返回值类型

@RestController
public class JsonResultController {
    @RequestMapping("/users")
    public JsonResult<User> getUser() {
        User user = new User(1l, "coder", "123456");
        return new JsonResult<>(user);
    }
    @RequestMapping("/lists")

    public JsonResult<List> getUserList() {
        List<User> userList = new ArrayList<>();
        User user1 = new User(1l, "coderfeng", "123456");
        User user2 = new User(2l, "fengcoder", "123456");
        userList.add(user1);
        userList.add(user2);
        return new JsonResult<>(userList,"user list get success");
    }
    @RequestMapping("/maps")
    public JsonResult<Map> getMap() {
        Map<String, Object> map = new HashMap<>(3);
        User user = new User(1l, "coderwang", "123456");
        map.put("作者信息", user);
        map.put("博客地址", "null");
        map.put("优快云地址", "https://blog.youkuaiyun.com/CodersCoder");
        map.put("粉丝数量", 0);
        return new JsonResult<>(map);
    }
}

在浏览器中输入: localhost:8080/json/users 返回 json 如下:

{“id”:1,“username”:“coder”,“password”:“123456”}

在浏览器中输入: localhost:8080/lists 返回 json 如下:

{“code”:“0000”,“data”:[{“id”:1,“password”:“123456”,“username”:“coderfeng”},{“id”:2,“password”:“123456”,“username”:“fengcoder”}],“msg”:“user list get success”}

在浏览器中输入: localhost:8080/maps 返回 json 如下:

{“code”:“0000”,“data”:{“作者信息”:{“id”:1,“password”:“123456”,“username”:“coderwang”},“优快云地址”:“https://blog.youkuaiyun.com/CodersCoder”,“粉丝数量”:0,“博客地址”:“null”},“msg”:“success”}

利用Python脚本在ADS2024 Update2中动态绘制与验证LPDDR5眼图模板 本文详细介绍了如何在ADS2024 Update2中,利用Python脚本动态绘制与验证LPDDR5眼图模板。通过调用DDS Python接口,工程师可在仿真后无需重新运行,即可灵活添加、修改矩形或六边形眼图模板,并实现批量自动化处理,从而极大提升高速信号(如LPDDR5)的调试与验证效率。 阅读详情

相关推荐

jaka+realsense+aruco+手眼标定(python)

第二次重建了项目的手眼标定部分……有很多第一次记录遗漏的地方,在此补充。

drivenzyw的博客 2122

Jackson的自定义序列化器调用默认序列化器详解

将我们完整的数据结构序列化为JSON时使用所有字段的精确一对一表示有时可能不合适,或者根本可能不是我们想要的。 相反,我们可能想要创建数据的扩展或简化视图。 这就是自定义 Jackson 序列化程序发挥作用的地方。

白石的专栏 5168

WSL2下用QEMU模拟ARM开发板:从编译uboot到调试全流程(附常见错误解决)

本文详细介绍了在WSL2环境下使用QEMU模拟ARM开发板的完整流程,包括uboot编译、内核调试等关键步骤。通过QEMU模拟vexpress-a9开发板,开发者可以高效搭建嵌入式开发环境,解决常见错误并提升开发效率。

solidity8miner的博客 286

Jackson 2.x 系列【17】序列化器提供者 SerializerProvider

ObjectMapper在执行过程中,需要获取到对应类型的序列化器或反序列化器,然后执行具体操作。例如在序列化时List,需要获取可以序列化List类型的JsonSerializer(序列化器)。 这时需要使用到SerializerProvider,它是一个负责提供特定类型序列化器的抽象类,并实现了缓存功能。

记录知识、锤炼自我 1855

P4VASP的安装 & 使用P4VASP画DOS(态密度)图

P4vasp 下载: 链接:https://pan.baidu.com/s/1JIptQVSFSopQls9CiSIoVA 提取码:sbhi 由于是免安装版本,直接右击解压即可,将出现以下文件: 双击既可运行P4vasp: 关于P4vasp的基本使用(使用P4vasp画DOS) 这里以vasp计算为例 首先导出DOS计算的文件夹中的vasprun.xml文件 从p4vasp导入该文件进行作图(直接将vasprun.xml拖入p4vasp一般不会有反应) 具体步骤: 点击open: 在弹出的弹窗

qq_42168543的博客 5万+

【Bug已解决】Codex Desktop 更新后无法启动/闪退解决方案

方案适用场景推荐指数清理本地缓存重启最常见、最应优先尝试的方案⭐⭐⭐⭐⭐完全卸载重装缓存清理无效时的进阶方案⭐⭐⭐⭐详细日志定位崩溃环节需要精确诊断问题原因⭐⭐⭐⭐锁定旧稳定版本确认是特定版本缺陷时的过渡方案⭐⭐⭐反馈官方支持团队自助方式无效时的最终途径⭐⭐⭐⭐Codex Desktop 更新后无法启动/闪退的本质通常是新版本程序在启动时读取到了旧版本遗留的、格式不兼容的本地缓存或配置数据,导致启动流程中途崩溃。

一键难忘的博客 6283

日常注解

@JsonForma,@JsonSerialize

太子的博客 445

10、边缘智能学习技术解析

本文深入解析了边缘智能学习技术的四大核心方法:联邦学习、DNN拆分、迁移学习和八卦学习。文章从人类大脑的学习机制出发,引出边缘级智能的重要性,并详细阐述各类技术的架构、优势、挑战及适用场景。通过对比分析,展示了不同技术在隐私性、效率、可扩展性等方面的特性,并探讨了未来融合多种技术、软硬件协同优化及应用领域拓展的发展趋势,为边缘智能在物联网与人工智能领域的应用提供了系统性参考。

ppp33的博客 117

java stdserializerprovider_自定义对象序列化与PreserveReferencesHandling

以下转换器为此提供了一个模板:public abstract class ReferenceHandlingCustomCreationConverter : JsonConverter where T : class{const string refProperty = "$ref";const string idProperty = "$id";public override bool Can...

weixin_29031161的博客 500

124、LLC谐振变换器的矩阵变压器设计

摘要 本文分享了LLC谐振变换器中矩阵变压器的实战设计经验。针对大功率LLC单颗变压器的痛点(绕组层数多、散热不均、漏感一致性差),作者提出将大变压器拆分为多个小变压器单元(建议6个),通过原边串联、副边并联的方式实现功率分配。详细解析了磁芯选型、匝比计算、绕组结构、漏感控制和散热设计等关键参数,特别强调了小磁芯优势、等效匝比计算误区以及三明治绕法的重要性。文中还总结了调试过程中的谐振频率偏移和均流问题解决方案,并给出了矩阵数量选择、磁芯材质、绝缘材料等实用建议。作者指出,矩阵变压器在2kW以上LLC应用中

Jack010169的博客 169

OpenCASCADE:写IGES

OpenCASCADE:写IGES程序涵盖的领域流程说明初始化过程设置翻译参数执行 Open CASCADE Technology 形状转换编写 IGES 文件将开放级联技术形状映射到 IGES 实体曲线表面拓扑实体——人脸模式下的平移公差管理在 IGES 文件中设置分辨率代码架构调用图例子 程序 您可以通过以下步骤将 OCCT 形状转换为 IGES 实体: 初始化进程。 设置翻译参数, 执行模型翻译, 写入输出 IGES 文件。 您可以在写入文件之前转换多个形状。每个形状都将是 IGES 模型中的根实体。

希望我的博客,能帮上你解决学习中工作中所遇到的问题 922

java stdserializerprovider_SerializerProvider

方法详细资料setNullKeySerializerpublic abstractvoidsetNullKeySerializer(JsonSerializernks)Method that can be used to specify serializer that will beused to write JSON property names matching null keys fo...

weixin_29532075的博客 457

解决Gradle中NPM命令失效问题

摘要:本文分析了IntelliJ IDEA中Gradle执行npm命令失败的问题,报错显示"npm"文件不存在。通过确认npm安装路径、检查系统PATH与Gradle环境的差异,提出两种解决方案:1) 在build.gradle中使用npm绝对路径;2) 通过launchctl修改用户PATH。实例展示了如何修改Gradle脚本或系统配置来解决该问题,指出跨平台开发中环境变量配置的重要性。文章为开发者提供了处理类似问题的实用方法。

2501_90323865的博客 90

Spring Boot学习笔记一

Spring Boot入门 Spring_Boot简介 简化spring应用开发的一个框架;(Spring Boot来建华Spring应用开发,约定大于配置,去繁从简,just run就能创建一个独立的,产品级别的应用。) 整个Spring技术栈的大整合。 j2EE开发的一站式解决方案。 微服务 微服务:架构风格 一个应用应该是一组小型服务;可以通过HTTP的方式进行互通;每一个功能元素最终都是一个可独立替换和独立升级的软件单元。 单体应用: ALL IN ONE Spring Boot He

weixin_42940901的博客 271

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【Spring Boot学习笔记一】helloworld

项目目录 代码 HelloController.java package com.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller public class H

weixin_45378289的博客 156

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Spring Boot实战学习笔记(一)

摘要本文为学习Spring Boot实战的学习笔记,学习了一遍,但是好记性不如烂笔头,所以文章记录下来。图书购买地址为: https://item.jd.com/11894632.html.Spring Boot实战学习笔记1Spring Boot实战学习笔记2Spring Boot实战学习笔记3Spring Boot实战学习笔记4Spring Boot实战学习笔记51.Spring 基础1.1 ...

殘遛的博客 426

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Spring Boot IntelliJ IDEA 学习笔记一

Spring Boot入门 Spring Boot官方文档 1.Spring Boot 简介 简化Spring应用开发的一个框架,相当于对整个Spring技术栈的大整合 ,J2EE开发的一站式解决方案 2.微服务(Microservices) 2014年,Martin Fowler:微服务是一种架构风格,一个应用应该是一组小型服务(可以通过HTTP的方式互通),每一个功能元素最终都是一个可独立替...

2020-10-28 254

spring boot jpa学习笔记(一)

文章目录 Jpa 是什么 spring boot jpa 能做什么 基本查询 复杂查询 自定义SQL操作 常用注解 yml配置

weiha666的博客 8847

信号完整性本质:高速PCB中电磁波传播与反射控制

信号完整性是高速数字电路设计的核心基础概念,其物理本质源于电磁波在PCB传输线中的传播行为。当数字信号频率升高,边沿陡峭,传统电平思维失效,必须回归麦克斯韦方程组描述的横电磁波(TEM波)模型——电压与电流耦合为行波,在特性阻抗失配处发生能量再分配式反射。这种反射不仅引发振铃、过冲等时域失真,更通过S参数劣化频域响应,导致眼图坍塌与码间干扰(ISI)。工程实践中,TDR定位阻抗突变、VNA量化S₁₁/S₂₁、眼图评估接收端质量,构成闭环验证链。本文聚焦‘信号是波’这一底层认知,解析反射、端接与串扰的物理机制

weixin_34204722的博客 322

Spring Boot学习笔记(一)Spring Boot入门

一、什么是Spring Boot Spring Boot是用来简化spring相关应用的搭建以及开发过程,约定大于配置,去繁从简。目前Spring框架非常多,常用的:spring MVC、Spring Data、Spring Security等等。按照我们以前的做法,如果要整合这么多的技术,我们需要导入所以相关包、写许多的配置,过程非常的繁琐。而现在使用Spring Boot,就可以省去这麻烦,因...

飞!!!的博客 594

【SpringBoot学习笔记】 一、Spring Boot 入门

一、Spring Boot 入门 1、Spring Boot 简介 简化Spring应用开发的一个框架; 整个Spring技术栈的一个大整合; J2EE开发的一站式解决方案; 2、微服务 2014,martin fowler 微服务:架构风格(服务微化) 一个应用应该是一组小型服务;可以通过HTTP的方式进行互通; 单体应用:ALL IN ONE 微服务:每一个功能元素最终都是一个可独立替换和...

illusion 214

spring boot 学习笔记(一)

一.关于jdk版本问题报错 解决:1.pom.xml中配置                        org.apache.maven.plugins            maven-compiler-plugin                            1.7                1.7

y670340559的博客 264

Spring Boot——学习笔记(一)

SprigBoot的特点: 1.化繁为简,简化配置 2.下一代框架 3.微服务的入门级微框架(SprigBoot—>SpringCloud—>微服务) 目录 1. 第一个SprigBoot程序 2. 自定义属性配置 3. Controller的使用 4. spring-data-jpa 5. 事务管理 1.检测是否安装配置好java和maven 创...

白木乔 249
上一篇: springboot使用SHA256加密算法对接口访问控制
下一篇: Spring Boot学习笔记(二)
CodersCoder
博客等级 码龄10年 90粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值