我正在升級我的專案版本,我目前正在使用 jackson-databind-2.13.0 。但我注意到 ObjectMapper 的 enable 方法已被棄用。
他們說改為這樣使用它。
@deprecated Since 2.13 use {@code JsonMapper.builder().enable(...)}
但我無法使用它。
下面是我的 ObjectMapper 實體創建代碼。我該如何改變?
@Bean(name = {"objectMapper"})
@Primary
ObjectMapper objectMapper() {
return newObjectMapper();
}
public static ObjectMapper newObjectMapper() {
ObjectMapper objectMapper =
new ObjectMapper()
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true)
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES);
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(OffsetDateTime.class, new OffsetDateTimeSerializer());
javaTimeModule.addDeserializer(OffsetDateTime.class, new OffsetDateTimeDeserializer());
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer());
javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer());
objectMapper
.registerModule(javaTimeModule)
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
return objectMapper;
}
解決方案:
ObjectMapper objectMapper = JsonMapper
.builder()
.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES)
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true)
.serializationInclusion(Include.NON_NULL).build();
uj5u.com熱心網友回復:
我建議將您的代碼重寫為
- 洗掉此 bean 并使用完全配置的 Spring Boot
ObjectMapper(名稱為jacksonObjectMapper) - 使用
Jackson2ObjectMapperBuilder來創建 的實體ObjectMapper。
所有這些解決方案都隱藏了構建的復雜部分,ObjectMapper并且還將(正確地)構建它的負擔推給了 Spring Boot 團隊,而不是你。
現在對于選項 1,您需要洗掉您的@Bean并將以下內容放入您的application.properties.
spring.jackson.serialization.FAIL_ON_EMPTY_BEANS=false
spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false
spring.jackson.deserialization.FAIL_ON_UNKNOWN_PROPERTIES=false
spring.jackson.deserialization.ACCEPT_SINGLE_VALUE_AS_ARRAY=true
spring.jackson.mapper.ACCEPT_CASE_INSENSITIVE_PROPERTIES=true
spring.jackson.defaultPropertyInclusion=NON_NULL
當 Spring (Boot)JavaTime在類路徑上檢測到模塊時,它將自動注冊到ObjectMapper,因此無需額外添加它(或與此相關的序列化程式)。
這些配置行應該ObjectMapper與您明確配置的配置相同。H
對于第二個選項,您可以Jackson2ObjectMapperBuilder使用引數將 注入到方法中,在那里配置您想要的東西并build最終呼叫該方法。
@Bean(name = {"objectMapper"})
@Primary
ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
return newObjectMapper(builder);
}
public static ObjectMapper newObjectMapper(Jackson2ObjectMapperBuilder builder) {
return builder
.serializationInclusion(NON_NULL)
.failOnEmptyBeans(false)
.failOnUnknownProperties(false)
.featuresToEnable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.build();
您仍然不需要注冊該JavaTime模塊,因為它仍在為您自動檢測。
理論上你可以結合 1 和 2 但在你的情況下不會增加太多,只有一些代碼來構造ObjectMapper.
@Bean(name = {"objectMapper"})
@Primary
ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
return newObjectMapper(builder);
}
public static ObjectMapper newObjectMapper(Jackson2ObjectMapperBuilder builder) {
return builder.build();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/404712.html
標籤:
上一篇:嘗試以angular呼叫SpringREST端點時,Originhttp://localhost:4200已被瀏覽器中的CORS策略錯誤阻止
