日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Spring Boot 自定義Jackson ObjectMapper,你學(xué)會了嗎?

在Spring Boot Web 項(xiàng)目中,當(dāng)使用JSON格式接收數(shù)據(jù)和返回?cái)?shù)據(jù)的時(shí)候,Spring Boot 默認(rèn)使用一個(gè)ObjectMapper實(shí)例來序列化響應(yīng)和反序列化請求。

十載的吉林網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都營銷網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整吉林建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“吉林網(wǎng)站設(shè)計(jì)”,“吉林網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

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

默認(rèn)配置

默認(rèn)情況下,Spring Boot的配置將禁用以下配置項(xiàng)。

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

舉個(gè)例子

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

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

public class Coffee {

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

//getter and setter
}

我們還將定義一個(gè)簡單的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);
}

默認(rèn)情況下,這將是調(diào)用GET http://lolcahost:8080/coffee?brand=javazzz 時(shí)的響應(yīng)。


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

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

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

在使用Spring Boot時(shí),我們可以選擇定制默認(rèn)的ObjectMapper或覆蓋它。我們將在接下來的章節(jié)中介紹這兩個(gè)選項(xiàng)。

自定義默認(rèn)的ObjectMapper

在本節(jié)中,我們將看到如何定制Spring Boot使用的默認(rèn)ObjectMapper。

1.應(yīng)用程序?qū)傩院妥远x Jackson 模塊

配置映射器的最簡單方法是通過應(yīng)用程序?qū)傩浴?/p>

下面是配置的一般結(jié)構(gòu)。

spring.jackson..=true,false

作為一個(gè)例子,下面是我們要添加的內(nèi)容,以禁用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

配置環(huán)境變量是最簡單的方法。這種方法的缺點(diǎn)是,我們不能定制高級選項(xiàng),比如為LocalDateTime定制日期格式。

在這一點(diǎn)上,我們會得到這樣的結(jié)果。

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

為了實(shí)現(xiàn)我們的目標(biāo),我們將注冊一個(gè)新的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將包含以下內(nèi)容。

spring.jackson.default-property-inclusion=non_null

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

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

2.Jackson2ObjectMapperBuilderCustomizer

這個(gè)功能接口的目的是讓我們創(chuàng)建配置。

它們將被應(yīng)用于通過Jackson2ObjectMapperBuilder創(chuàng)建的默認(rèn)ObjectMapper。

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

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

重寫默認(rèn)配置

如果我們想完全控制配置,有幾個(gè)選項(xiàng)可以禁用自動配置,只允許應(yīng)用我們的自定義配置。

讓我們仔細(xì)研究一下這些選項(xiàng)。

1.ObjectMapper

覆蓋默認(rèn)配置的最簡單方法是定義一個(gè)ObjectMapper Bean并將其標(biāo)記為@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);
}

當(dāng)我們想完全控制序列化過程而不想允許外部配置時(shí),我們應(yīng)該使用這種方法。

2.Jackson2ObjectMapperBuilder

另一種干凈的方法是定義一個(gè)Jackson2ObjectMapperBuilderbean。

實(shí)際上,Spring Boot在構(gòu)建ObjectMapper時(shí)默認(rèn)使用這個(gè)構(gòu)建器,并會自動拾取定義的構(gòu)建器。

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

它將默認(rèn)配置兩個(gè)選項(xiàng)。

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

根據(jù)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類和數(shù)據(jù)類

這種方法的優(yōu)點(diǎn)是,Jackson2ObjectMapperBuilder提供了一種簡單而直觀的方法來構(gòu)建ObjectMapper。

3.MappingJackson2HttpMessageConverter的方法

我們可以直接定義一個(gè)類型為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。

通過這種方式,我們可以驗(yàn)證我們的Coffee對象在序列化時(shí)沒有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 + "\"}");
}

總結(jié)

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

我們看到了兩種不同的方法:配置默認(rèn)選項(xiàng)或重寫默認(rèn)配置。


當(dāng)前名稱:Spring Boot 自定義Jackson ObjectMapper,你學(xué)會了嗎?
文章轉(zhuǎn)載:http://www.dlmjj.cn/article/copgiii.html