成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring Boot 自定義Jackson ObjectMapper,你學會了嗎?

開發 項目管理
在這篇文章中,我們看了使用Spring Boot時配置JSON序列化選項的幾種方法。我們看到了兩種不同的方法:配置默認選項或重寫默認配置。

在Spring Boot Web 項目中,當使用JSON格式接收數據和返回數據的時候,Spring Boot 默認使用一個ObjectMapper實例來序列化響應和反序列化請求。

在本文中,我們將看看配置序列化和反序列化選項的最常用方法。

默認配置

默認情況下,Spring Boot的配置將禁用以下配置項。

  • MapperFeature.DEFAULT_VIEW_INCLUSION
  • DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES
  • SerializationFeature.WRITE_DATES_AS_TIMESTAMPS。

舉個例子

  • 客戶端將發送一個GET請求到我們的/coffee?name=Javazzz。
  • 控制器將返回一個新的Coffee對象。
  • Spring將使用ObjectMapper將我們的POJO序列化為JSON。

我們將通過使用String和LocalDateTime對象來示范定制選項。

public class Coffee {

private String name;
private String brand;
private LocalDateTime date;

//getter and setter
}

我們還將定義一個簡單的REST控制器來演示序列化。

@GetMapping("/coffee")
public Coffee getCoffee(
@RequestParam(required = false) String brand,
@RequestParam(required = false) String name) {
return new Coffee()
.setBrand(brand)
.setDate(FIXED_DATE)
.setName(name);
}

默認情況下,這將是調用GET http://lolcahost:8080/coffee?brand=javazzz 時的響應。


{
"name": null,
"brand": "javazzz",
"date": "2022-06-16T10:21:35.974"
}

我們希望排除空值,并有一個自定義的日期格式(dd-MM-yyyy HH:mm)。這就是我們的響應結果。

{
"brand": "javazzz",
"date": "06-11-2022 10:34"
}

在使用Spring Boot時,我們可以選擇定制默認的ObjectMapper或覆蓋它。我們將在接下來的章節中介紹這兩個選項。

自定義默認的ObjectMapper

在本節中,我們將看到如何定制Spring Boot使用的默認ObjectMapper。

1.應用程序屬性和自定義 Jackson 模塊

配置映射器的最簡單方法是通過應用程序屬性。

下面是配置的一般結構。

spring.jackson.<category_name>.<feature_name>=true,false

作為一個例子,下面是我們要添加的內容,以禁用SerializationFeature.WRITE_DATES_AS_TIMESTAMPS。

spring.jackson.serialization.write-dates-as-timestamps=false

除了提到的特征類別,我們還可以配置屬性的包含。

spring.jackson.default-property-inclusion=always, non_null, non_absent, non_default, non_empty

配置環境變量是最簡單的方法。這種方法的缺點是,我們不能定制高級選項,比如為LocalDateTime定制日期格式。

在這一點上,我們會得到這樣的結果。

{
"brand": "javazzz",
"date": "2022-06-16T10:35:34.593"
}

為了實現我們的目標,我們將注冊一個新的JavaTimeModule,用我們的自定義日期格式。

@Configuration
@PropertySource("classpath:coffee.properties")
public class CoffeeRegisterModuleConfig {

@Bean
public Module javaTimeModule() {
JavaTimeModule module = new JavaTimeModule();
module.addSerializer(LOCAL_DATETIME_SERIALIZER);
return module;
}
}

另外,配置屬性文件coffee.properties將包含以下內容。

spring.jackson.default-property-inclusion=non_null

Spring Boot會自動注冊任何類型為com.fastxml.jackson.databind.Module的bean。下面是我們的最終結果。

{
"brand": "Javazzz",
"date": "16-06-2022 10:43"
}

2.Jackson2ObjectMapperBuilderCustomizer

這個功能接口的目的是讓我們創建配置。

它們將被應用于通過Jackson2ObjectMapperBuilder創建的默認ObjectMapper。

@Bean
public Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {
return builder -> builder.serializationInclusion(JsonInclude.Include.NON_NULL)
.serializers(LOCAL_DATETIME_SERIALIZER);
}

配置得以特定的順序應用,我們可以使用@Order annotation來控制。如果我們想從不同的配置或模塊來配置ObjectMapper,這種優雅的方法是適合的。

重寫默認配置

如果我們想完全控制配置,有幾個選項可以禁用自動配置,只允許應用我們的自定義配置。

讓我們仔細研究一下這些選項。

1.ObjectMapper

覆蓋默認配置的最簡單方法是定義一個ObjectMapper Bean并將其標記為@Primary。

@Bean
@Primary
public ObjectMapper objectMapper() {
JavaTimeModule module = new JavaTimeModule();
module.addSerializer(LOCAL_DATETIME_SERIALIZER);
return new ObjectMapper()
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
.registerModule(module);
}

當我們想完全控制序列化過程而不想允許外部配置時,我們應該使用這種方法。

2.Jackson2ObjectMapperBuilder

另一種干凈的方法是定義一個Jackson2ObjectMapperBuilderbean。

實際上,Spring Boot在構建ObjectMapper時默認使用這個構建器,并會自動拾取定義的構建器。

@Bean
public Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
return new Jackson2ObjectMapperBuilder().serializers(LOCAL_DATETIME_SERIALIZER)
.serializationInclusion(JsonInclude.Include.NON_NULL);
}

它將默認配置兩個選項。

  • 禁用MapperFeature.DEFAULT_VIEW_INCLUSION
  • 禁用DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES。

根據Jackson2ObjectMapperBuilder 文檔,如果classpath上有一些模塊,它也會注冊這些模塊。

  • jackson-datatype-jdk8:支持其他Java 8類型,如Optional
  • jackson-datatype-jsr310:支持Java 8 Date and Time API類型
  • jackson-datatype-joda:支持Joda-Time類型
  • jackson-module-kotlin:支持Kotlin類和數據類

這種方法的優點是,Jackson2ObjectMapperBuilder提供了一種簡單而直觀的方法來構建ObjectMapper。

3.MappingJackson2HttpMessageConverter的方法

我們可以直接定義一個類型為MappingJackson2HttpMessageConverter的bean,Spring Boot會自動使用它。

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder().serializers(LOCAL_DATETIME_SERIALIZER)
.serializationInclusion(JsonInclude.Include.NON_NULL);
return new MappingJackson2HttpMessageConverter(builder.build());
}

測試配置

為了測試我們的配置,我們將使用TestRestTemplate并將對象序列化為String。

通過這種方式,我們可以驗證我們的Coffee對象在序列化時沒有null值,并且具有自定義的日期格式。

@Test
public void whenGetCoffee_thenSerializedWithDateAndNonNull() {
String formattedDate = DateTimeFormatter.ofPattern(CoffeeConstants.dateTimeFormat).format(FIXED_DATE);
String brand = "Javazza";
String url = "/coffee?brand=" + brand;

String response = restTemplate.getForObject(url, String.class);

assertThat(response).isEqualTo("{\"brand\":\"" + brand + "\",\"date\":\"" + formattedDate + "\"}");
}

總結

在這篇文章中,我們看了使用Spring Boot時配置JSON序列化選項的幾種方法。

我們看到了兩種不同的方法:配置默認選項或重寫默認配置。

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2022-07-11 09:00:37

依賴配置文件Mybati

2024-01-02 07:04:23

2022-08-08 08:17:43

類隔離加載器自定義類

2024-11-27 11:07:20

vue計算屬性

2022-07-08 08:17:48

Spring接口配置

2023-11-06 07:25:51

Spring配置應用程序

2022-02-17 07:10:39

Nest自定義注解

2024-01-19 08:25:38

死鎖Java通信

2023-01-10 08:43:15

定義DDD架構

2024-02-04 00:00:00

Effect數據組件

2023-07-26 13:11:21

ChatGPT平臺工具

2023-05-05 08:29:15

Spring后臺服務器

2022-04-26 08:41:54

JDK動態代理方法

2022-01-20 07:31:49

架構

2024-03-04 07:41:18

SpringAOPOOP?

2023-10-10 11:04:11

Rust難點內存

2024-05-06 00:00:00

InnoDBView隔離

2024-07-31 08:39:45

Git命令暫存區

2023-12-12 08:02:10

2023-01-30 09:01:54

圖表指南圖形化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区二区三区视频在线观看 | 2019天天操| 免费在线观看一区二区 | 日韩欧美精品 | 国产精品久久9 | 日韩成人精品在线 | 亚洲综合无码一区二区 | 国产激情一区二区三区 | 欧美亚洲国产精品 | 国产一区二区三区在线视频 | 亚洲国产高清在线观看 | 精品毛片| 日本电影韩国电影免费观看 | 日韩在线视频一区 | 中文字幕在线电影观看 | 又黄又色 | 一区二区三区中文字幕 | 日韩国产免费 | 久久精品久久综合 | 久久久高清 | 亚洲精品国产成人 | 国产美女h视频 | 九色在线视频 | 亚洲综合日韩精品欧美综合区 | h视频亚洲 | 无码日韩精品一区二区免费 | 午夜性色a√在线视频观看9 | 黄频免费 | 成人免费视频观看视频 | 精品国产一区二区三区久久狼黑人 | 国产清纯白嫩初高生在线播放视频 | 综合久 | 新超碰97| 久久亚洲欧美日韩精品专区 | 九九99精品 | 午夜小电影 | 国产精品区二区三区日本 | 欧美日韩在线一区二区 | 国产成人aⅴ| 免费观看av | 日韩国产三区 |