日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

SpringBoot中如何優雅地個性化定制Jackson

來源: 責編: 時間:2023-12-20 17:46:56 236觀看
導讀哈嘍,大家好,我是了不起。當使用 JSON 格式時,Spring Boot 將使用ObjectMapper實例來序列化響應和反序列化請求。在本教程中,我們將了解配置序列化和反序列化選項的最常用方法。一、默認配置默認情況下,Spring Boot 配置將

哈嘍,大家好,我是了不起。plD28資訊網——每日最新資訊28at.com

當使用 JSON 格式時,Spring Boot 將使用ObjectMapper實例來序列化響應和反序列化請求。plD28資訊網——每日最新資訊28at.com

在本教程中,我們將了解配置序列化和反序列化選項的最常用方法。plD28資訊網——每日最新資訊28at.com

plD28資訊網——每日最新資訊28at.com

一、默認配置

默認情況下,Spring Boot 配置將禁用以下功能:plD28資訊網——每日最新資訊28at.com

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

例子

讓我們從一個簡單的例子開始:plD28資訊網——每日最新資訊28at.com

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

我們將通過使用 String 和 LocalDateTime 對象來舉例說明自定義選項:plD28資訊網——每日最新資訊28at.com

@Datapublic class Boy {    private String name;    private Integer age;    private LocalDateTime birth;}

我們還將定義一個簡單的 REST 控制器來演示序列化:plD28資訊網——每日最新資訊28at.com

@GetMapping("/boy")public Boy getBoy(    @RequestParam(required = false) Integer age,    @RequestParam(required = false) String name) {    return new Boy()      .setAge(age)      .setDate(LocalDateTime.now())      .setName(name);}

默認情況下,這將是調用 GET http://localhost:8080/boy?name=gotanks 時的響應:plD28資訊網——每日最新資訊28at.com

{  "name": "gotanks",  "age": null,  "date": "2023-12-19T10:21:35.974"}

我們希望排除空值并使用自定義日期格式 yyyy-MM-dd HH:mm:ss。這是我們的最終回應:plD28資訊網——每日最新資訊28at.com

{  "name": "gotanks",  "date": "2023-12-19 10:21:35"}

二、自定義ObjectMapper

下面,我們將了解如何自定義 Spring Boot 使用的默認ObjectMapper。plD28資訊網——每日最新資訊28at.com

1.應用程序屬性

配置映射器的最簡單方法是通過 application.propertiesplD28資訊網——每日最新資訊28at.com

這是配置的一般結構:plD28資訊網——每日最新資訊28at.com

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

例如,我們將添加以下內容以禁用 SerializationFeature.WRITE_DATES_AS_TIMESTAMPS:plD28資訊網——每日最新資訊28at.com

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

除了提到的特征類別,我們還可以配置屬性包含:plD28資訊網——每日最新資訊28at.com

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

配置環境變量是最簡單的方法。這種方法的缺點是我們無法自定義高級選項,例如為LocalDateTime自定義日期格式。plD28資訊網——每日最新資訊28at.com

2.自定義 Jackson 模塊

為了實現我們的目標,我們將使用我們的自定義日期格式注冊一個新的 JavaTimeModule :plD28資訊網——每日最新資訊28at.com

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

SpringBoot 將自動注冊com.fasterxml.jackson.databind.Module類型的任何 bean 。這是我們的最終結果:plD28資訊網——每日最新資訊28at.com

{  "name": "gotanks",  "age": null,  "date": "2023-12-19 10:21:35"}

3.Jackson2ObjectMapperBuilderCustomizer

這個函數接口的目的是允許我們創建配置bean。plD28資訊網——每日最新資訊28at.com

它們將被應用到通過 Jackson2ObjectMapperBuilder 創建的默認 ObjectMapper:plD28資訊網——每日最新資訊28at.com

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

配置bean以特定的順序應用,我們可以使用 @Order 注解控制該順序。如果我們想從不同的配置或模塊配置ObjectMapper,那么這種優雅的方法非常適合。plD28資訊網——每日最新資訊28at.com

三、覆蓋默認配置

如果我們想完全控制配置,有幾個選項可以禁用自動配置并只允許應用我們的自定義配置。plD28資訊網——每日最新資訊28at.com

讓我們仔細看看這些選項。plD28資訊網——每日最新資訊28at.com

1.ObjectMapper

覆蓋默認配置的最簡單方法是定義一個ObjectMapper bean 并將其標記為 @Primary:plD28資訊網——每日最新資訊28at.com

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

當我們想要完全控制序列化過程并且不想允許外部配置時,我們應該使用這種方法。plD28資訊網——每日最新資訊28at.com

2.Jackson2ObjectMapperBuilder

另一種干凈的方法是定義一個Jackson2ObjectMapperBuilder bean 。plD28資訊網——每日最新資訊28at.com

Spring Boot 實際上在構建ObjectMapper時默認使用這個構建器,并且會自動選擇定義的那個:plD28資訊網——每日最新資訊28at.com

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

它會默認配置兩個選項:plD28資訊網——每日最新資訊28at.com

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

根據Jackson2ObjectMapperBuilder文檔,如果它們存在于類路徑中,它還將注冊一些模塊:plD28資訊網——每日最新資訊28at.com

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

這種方法的優點是 Jackson2ObjectMapperBuilder 提供了一種簡單直觀的方式來構建 ObjectMapper。plD28資訊網——每日最新資訊28at.com

3.MappingJackson2HttpMessageConverter

我們可以定義一個MappingJackson2HttpMessageConverter 類型的 bean ,Spring Boot 會自動使用它:plD28資訊網——每日最新資訊28at.com

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

四、總結

在本文中,我們了解了在使用 SpringBoot 時配置 JSON 序列化選項的幾種方法。plD28資訊網——每日最新資訊28at.com

我們看到了兩種不同的方法:配置默認選項或覆蓋默認配置。plD28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-50760-0.htmlSpringBoot中如何優雅地個性化定制Jackson

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 面試官:什么是虛擬線程?為什么要有虛擬線程?

下一篇: Linux從外到內剝開動態庫,一個簡單例子看懂Linux下的動態庫開發原理

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 鹤峰县| 南通市| 襄垣县| 淳化县| 将乐县| 碌曲县| 四子王旗| 拜泉县| 弥渡县| 巴塘县| 施秉县| 鄂州市| 文山县| 揭东县| 余姚市| 巴里| 新源县| 雅安市| 淄博市| 双鸭山市| 湾仔区| 增城市| 合阳县| 望江县| 黄平县| 锦州市| 台山市| 弋阳县| 墨脱县| 安宁市| 晴隆县| 共和县| 彰化市| 凌源市| 永嘉县| 海原县| 平湖市| 中方县| 大丰市| 和平区| 林周县|