写点什么

jackson 学习之九:springboot 整合 (配置文件)

作者:程序员欣宸
  • 2022 年 4 月 14 日
  • 本文字数:5168 字

    阅读完需:约 17 分钟

jackson学习之九:springboot整合(配置文件)

欢迎访问我的 GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

关于 springboot 整合 jackson

  • 本文是《jackson 学习》系列的第九篇,学习如何在 springboot 项目中使用 jackson,以 springboot-2.3.3 版本为例,jackson 是 springboot 的默认 json 处理工具,如下图红框所示,jackson 在 maven 配置中被 spring-boot-starter-web 间接依赖,可直接使用:


  • 在 springboot 项目中常用的配置方式有两种:

  1. 用 properties 或 yml 配置文件来配置,即本篇的内容;

  2. 用配置类来配置,这是下一篇文章的主题;

本篇概览

今天实战内容如下:

  1. 开发 springboot 应用,体验 springboot 默认支持 jackson,包括 jackson 注解和 ObjectMapper 实例的注入;

  2. application.yml 中添加 jackson 配置,验证是否生效;

源码下载

  1. 如果您不想编码,可以在 GitHub 下载所有源码,地址和链接信息如下表所示(https://github.com/zq2599/blog_demos):

  1. 这个 git 项目中有多个文件夹,本章的应用在 jacksondemo 文件夹下,如下图红框所示:

  2. jacksondemo 是父子结构的工程,本篇的代码在 springbootproperties 子工程中,如下图:

开始实战

  1. 由于同属于《jackson 学习》系列文章,因此本篇的 springboot 工程作为 jacksondemo 的子工程存在,pom.xml 如下,需要注意的是 parent 不能使用 spring-boot-starter-parent,而是通过 dependencyManagement 节点来引入 springboot 依赖:


<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <parent>        <artifactId>jacksondemo</artifactId>        <groupId>com.bolingcavalry</groupId>        <version>1.0-SNAPSHOT</version>        <relativePath>../pom.xml</relativePath>    </parent>    <groupId>com.bolingcavalry</groupId>    <artifactId>springbootproperties</artifactId>    <version>0.0.1-SNAPSHOT</version>    <name>springbootproperties</name>    <description>Demo project for Spring Boot</description>
<properties> <java.version>1.8</java.version> </properties>

<!--不用spring-boot-starter-parent作为parent时的配置--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.3.3.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency>
<!-- swagger依赖 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> </dependency> <!-- swagger-ui --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> </dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
</project>
复制代码
  1. 启动类很平常:


package com.bolingcavalry.springbootproperties;
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplicationpublic class SpringbootpropertiesApplication {
public static void main(String[] args) { SpringApplication.run(SpringbootpropertiesApplication.class, args); }}
复制代码


  1. 由于用到了 swagger,因此要添加 swagger 配置:


package com.bolingcavalry.springbootproperties;
import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import springfox.documentation.builders.ApiInfoBuilder;import springfox.documentation.builders.PathSelectors;import springfox.documentation.builders.RequestHandlerSelectors;import springfox.documentation.service.ApiInfo;import springfox.documentation.service.Contact;import springfox.documentation.service.Tag;import springfox.documentation.spi.DocumentationType;import springfox.documentation.spring.web.plugins.Docket;import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration@EnableSwagger2public class SwaggerConfig {
@Bean public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .tags(new Tag("JsonPropertySerializationController", "JsonProperty相关测试")) .select() // 当前包路径 .apis(RequestHandlerSelectors.basePackage("com.bolingcavalry.springbootproperties.controller")) .paths(PathSelectors.any()) .build(); }
//构建 api文档的详细信息函数,注意这里的注解引用的是哪个 private ApiInfo apiInfo() { return new ApiInfoBuilder() //页面标题 .title("SpringBoot整合Jackson(基于配置文件)") //创建人 .contact(new Contact("程序员欣宸", "https://github.com/zq2599/blog_demos", "zq2599@gmail.com")) //版本号 .version("1.0") //描述 .description("API 描述") .build(); }}
复制代码


  1. 序列化和反序列化用到的 Bean 类,可见使用了 JsonProperty 属性来设置序列化和反序列化时的 json 属性名,field0 字段刻意没有 get 方法,是为了验证 JsonProperty 的序列化能力:


package com.bolingcavalry.springbootproperties.bean;
import com.fasterxml.jackson.annotation.JsonProperty;import io.swagger.annotations.ApiModel;import io.swagger.annotations.ApiModelProperty;
import java.util.Date;
@ApiModel(description = "JsonProperty注解测试类")public class Test {
@ApiModelProperty(value = "私有成员变量") @JsonProperty(value = "json_field0", index = 1) private Date field0 = new Date();
public void setField0(Date field0) { this.field0 = field0; }
@ApiModelProperty(value = "来自get方法的字符串") @JsonProperty(value = "json_field1", index = 0) public String getField1() { return "111"; }
@Override public String toString() { return "Test{" + "field0=" + field0 + '}'; }}
复制代码


  1. 测试用的 Controller 代码如下,很简单只有两个接口,serialization 返回序列化结果,deserialization 接受客户端请求参数,反序列化成实例,通过 toString()来检查反序列化的结果,另外,还通过 Autowired 注解从 spring 容器中将 ObjectMapper 实例直接拿来用:


package com.bolingcavalry.springbootproperties.controller;
import com.bolingcavalry.springbootproperties.bean.Test;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.ObjectMapper;import io.swagger.annotations.Api;import io.swagger.annotations.ApiOperation;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RestController;
@RestController@RequestMapping("/jsonproperty")@Api(tags = {"JsonPropertySerializationController"})public class JsonPropertySerializationController {
private static final Logger logger = LoggerFactory.getLogger(JsonPropertySerializationController.class);
@Autowired ObjectMapper mapper;
@ApiOperation(value = "测试序列化", notes = "测试序列化") @RequestMapping(value = "/serialization", method = RequestMethod.GET) public Test serialization() throws JsonProcessingException {
Test test = new Test(); logger.info(mapper.writeValueAsString(test));
return test; }
@ApiOperation(value = "测试反序列化", notes="测试反序列化") @RequestMapping(value = "/deserialization",method = RequestMethod.PUT) public String deserialization(@RequestBody Test test) { return test.toString(); }}
复制代码

验证(不用配置文件)

  1. 先来看看没有配置文件时,默认的 jackson 配置的表现,直接在 IDEA 上运行 SpringbootpropertiesApplication;

  2. 浏览器访问 http://localhost:8080/swagger-ui.html ,如下图红框 1,json_field0 和 json_field1 都是 JsonProperty 注释,出现在了 swagger 的 model 中,这证明 jackson 注解已经生效:


  1. 点击上图的红框 2,看看 springboot 引用返回的序列化结果,如下图:

  1. 另外,上述红框中的 json 格式,每个属性单独一行,像是做了格式化调整的,这是 springboot 做的?还是 swagger 展示的时候做的?用浏览器访问 http://localhost:8080/jsonproperty/serialization ,结果如下,可见 springboot 返回的是未经过格式化的 json

  • 接下来咱们添加 jackson 相关的配置信息并验证是否生效;

添加配置文件并验证

  1. resources 目录新增 application.yml 文件,内容如下:


spring:  jackson:    # 日期格式化    date-format: yyyy-MM-dd HH:mm:ss    # 序列化相关    serialization:      # 格式化输出      indent_output: true      # 忽略无法转换的对象      fail_on_empty_beans: true    # 反序列化相关    deserialization:      # 解析json时,遇到不存在的属性就忽略      fail_on_unknown_properties: false    # 设置空如何序列化    defaultPropertyInclusion: NON_EMPTY    parser:      # 允许特殊和转义符      allow_unquoted_control_chars: true      # 允许单引号      allow_single_quotes: true
复制代码
  1. 将鼠标放置下图红框位置,再按住 Ctlr 键,IDEA 会弹出一个浮层,提示该配置对应的 jackson 代码,如下图:


  1. 在上图中,按住 Ctlr 键,用鼠标点击红框位置即可打开此配置对应的 jackson 源码,如下图:

  2. 重新运行 springboot 应用,用浏览器访问:http://localhost:8080/jsonproperty/serialization ,结果如下图,可见 json_field0 的格式变成了 yyyy-MM-dd HH:mm:ss,而且 json 输出也做了格式化,证明 application.yml 中的配置已经生效:

  3. 再来试试反序列化,打开 swagger 页面,操作和响应如下图所示,注意红框 1 里面请求参数的格式:

- 至此,在 springboot 中通过 yml 配置 jackson 的操作实战就完成了,接下来的章节,咱们在配置类中用代码来完成 yml 的配置;

欢迎关注 InfoQ:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

发布于: 2022 年 04 月 14 日阅读数: 33
用户头像

搜索"程序员欣宸",一起畅游Java宇宙 2018.04.19 加入

前腾讯、前阿里员工,从事Java后台工作,对Docker和Kubernetes充满热爱,所有文章均为作者原创,个人Github:https://github.com/zq2599/blog_demos

评论

发布
暂无评论
jackson学习之九:springboot整合(配置文件)_4月月更_程序员欣宸_InfoQ写作平台