我正在升级我的项目的版本,我目前正在使用jackson-databind-2.13.0 .But,我注意到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();
发布于 2022-01-06 09:48:02
我建议重写你的代码
jacksonObjectMapper
)
ObjectMapper
(名称为Jackson2ObjectMapperBuilder
)来创建ObjectMapper
.实例所有这些解决方案都隐藏了构建ObjectMapper
的复杂部分,并将(正确地)构建它的负担交给Spring团队,而不是您。
现在,对于选项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();
}
发布于 2022-05-18 15:53:53
在通过MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS
启用Enum不区分大小写反序列化时,我遇到了类似的问题。
在我的例子中,由于ObjectMapper
以前是由外部源构建的,所以无法切换到构建器方法。因此,唯一的选择是直接修改ObjectMapper
反序列化配置。寻找替代方案以避免被废弃的API objectMapper.enable(MappedFeature... f)
我找到了一个解决办法.
通过setter方法调用配置的instance.
with(MapperFeature... features)
--与新配置的ObjectMapper
原始配置--从ObjectMapper
MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS
。这也适用于SerializationConfig
,它是一种在已经构造的ObjectMapper
上修改配置而不使用不推荐的API的一种方法。
public void customizeMapper(ObjectMapper objectMapper) {
final DeserializationConfig originalConfig = objectMapper.getDeserializationConfig();
final DeserializationConfig newConfig = originalConfig.with(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS);
objectMapper.setConfig(newConfig);
}
注意:使用杰克逊的构建器的绝对是一个更好的解决方案。只有在不可能使用生成器的情况下,才考虑使用这种方法。
https://stackoverflow.com/questions/70604058
复制相似问题