歡迎訪問我的GitHub
這裡分類和彙總了欣宸的全部原創(含配套原始碼):https://github.com/zq2599/blog_demos
系列文章彙總
- jackson學習之一:基本資訊
- jackson學習之二:jackson-core
- jackson學習之三:常用API操作
- jackson學習之四:WRAP_ROOT_VALUE(root物件)
- jackson學習之五:JsonInclude註解
- jackson學習之六:常用類註解
- jackson學習之七:常用Field註解
- jackson學習之八:常用方法註解
- jackson學習之九:springboot整合(配置檔案)
- jackson學習之十(終篇):springboot整合(配置類)
關於springboot整合jackson
- 本文是《jackson學習》系列的第九篇,學習如何在springboot專案中使用jackson,以springboot-2.3.3版本為例,jackson是springboot的預設json處理工具,如下圖紅框所示,jackson在maven配置中被spring-boot-starter-web間接依賴,可直接使用:
- 在springboot專案中常用的配置方式有兩種:
- 用properties或yml配置檔案來配置,即本篇的內容;
- 用配置類來配置,這是下一篇文章的主題;
本篇概覽
今天實戰內容如下:
- 開發springboot應用,體驗springboot預設支援jackson,包括jackson註解和ObjectMapper例項的注入;
- 在application.yml中新增jackson配置,驗證是否生效;
原始碼下載
- 如果您不想編碼,可以在GitHub下載所有原始碼,地址和連結資訊如下表所示(https://github.com/zq2599/blog_demos):
名稱 | 連結 | 備註 |
---|---|---|
專案主頁 | https://github.com/zq2599/blog_demos | 該專案在GitHub上的主頁 |
git倉庫地址(https) | https://github.com/zq2599/blog_demos.git | 該專案原始碼的倉庫地址,https協議 |
git倉庫地址(ssh) | git@github.com:zq2599/blog_demos.git | 該專案原始碼的倉庫地址,ssh協議 |
- 這個git專案中有多個資料夾,本章的應用在jacksondemo資料夾下,如下圖紅框所示:
- jacksondemo是父子結構的工程,本篇的程式碼在springbootproperties子工程中,如下圖:
開始實戰
- 由於同屬於《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>
- 啟動類很平常:
package com.bolingcavalry.springbootproperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootpropertiesApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootpropertiesApplication.class, args);
}
}
- 由於用到了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
@EnableSwagger2
public 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();
}
}
- 序列化和反序列化用到的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 +
'}';
}
}
- 測試用的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();
}
}
驗證(不用配置檔案)
- 先來看看沒有配置檔案時,預設的jackson配置的表現,直接在IDEA上執行SpringbootpropertiesApplication;
- 瀏覽器訪問http://localhost:8080/swagger-ui.html ,如下圖紅框1,json_field0和json_field1都是JsonProperty註釋,出現在了swagger的model中,這證明jackson註解已經生效:
- 點選上圖的紅框2,看看springboot引用返回的序列化結果,如下圖:
- 另外,上述紅框中的json格式,每個屬性單獨一行,像是做了格式化調整的,這是springboot做的?還是swagger展示的時候做的?用瀏覽器訪問http://localhost:8080/jsonproperty/serialization ,結果如下,可見springboot返回的是未經過格式化的json:
- 接下來我們們新增jackson相關的配置資訊並驗證是否生效;
新增配置檔案並驗證
- 在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
- 將滑鼠放置下圖紅框位置,再按住Ctlr鍵,IDEA會彈出一個浮層,提示該配置對應的jackson程式碼,如下圖:
- 在上圖中,按住Ctlr鍵,用滑鼠點選紅框位置即可開啟此配置對應的jackson原始碼,如下圖:
4. 重新執行springboot應用,用瀏覽器訪問:http://localhost:8080/jsonproperty/serialization ,結果如下圖,可見json_field0的格式變成了yyyy-MM-dd HH:mm:ss,而且json輸出也做了格式化,證明application.yml中的配置已經生效:
5. 再來試試反序列化,開啟swagger頁面,操作和響應如下圖所示,注意紅框1裡面請求引數的格式:
- 至此,在springboot中通過yml配置jackson的操作實戰就完成了,接下來的章節,我們們在配置類中用程式碼來完成yml的配置;
你不孤單,欣宸原創一路相伴
歡迎關注公眾號:程式設計師欣宸
微信搜尋「程式設計師欣宸」,我是欣宸,期待與您一同暢遊Java世界...
https://github.com/zq2599/blog_demos