序列化反序列化对象我使用Jackson作为流程
@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
private LocalDate openingDate
如何将其设为全局默认值,以便我不必将其添加到每个属性中?
使用XML配置。
答案 0 :(得分:4)
如果您使用的是基于Java的配置,则可以创建扩展WebMvcConfigurerAdapter的配置类并执行以下操作:
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
converter.setObjectMapper(objectMapper);
converters.add(converter);
super.configureMessageConverters(converters);
}
在这里,您可以根据需要配置ObjectMapper并将其设置为转换器。
答案 1 :(得分:2)
您可以在spring Jackson2ObjectMapperFactoryBean
中使用配置序列化程序(提供完全限定的类名),然后将其与MappingJackson2HttpMessageConverter
绑定。以下是XML
配置代码段示例:
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.web.context.support.Jackson2ObjectMapperFactoryBean"
p:failOnEmptyBeans="false"
p:indentOutput="true">
<property name="serializers">
<array>
<bean class="LocalDateSerializer" />
</array>
</property>
</bean>
</property>
</bean>
文档的link
答案 2 :(得分:1)
你可以安装模块来使用java datetime或jodatime之类的东西。结帐:
@Bean
Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder() {
JavaTimeModule module = new JavaTimeModule();
module.addSerializer(OffsetDateTime.class, JSR310DateTimeSerializer.INSTANCE);
module.addSerializer(ZonedDateTime.class, JSR310DateTimeSerializer.INSTANCE);
module.addSerializer(LocalDateTime.class, JSR310DateTimeSerializer.INSTANCE);
module.addSerializer(Instant.class, JSR310DateTimeSerializer.INSTANCE);
module.addDeserializer(LocalDate.class, JSR310LocalDateDeserializer.INSTANCE);
return new Jackson2ObjectMapperBuilder()
.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.findModulesViaServiceLoader(true)
.modulesToInstall(module);
}
答案 3 :(得分:1)
使用Spring Boot,您可以通过注册新的Module
来实现此目的。
@Configuration
public class AppConfig {
@Bean
public Module module() {
SimpleModule module = new SimpleModule("Module", new Version(1, 0, 0, null, null, null));
module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());
return module;
}
}
如文档here
中所述杰克逊1.7增加了注册序列化器和反序列化的能力 模块界面。这是添加自定义的推荐方法 序列化程序 - 所有序列化程序都被认为是“通用的”,因为它们 除非找到更具体的结合,否则用于亚型。
和here:
com.fasterxml.jackson.databind.Module
类型的任何bean都是 自动注册自动配置Jackson2ObjectMapperBuilder
并适用于任何ObjectMapper
它创建的实例。这提供了一种全球机制 在为您的新功能添加新功能时提供自定义模块 应用
答案 4 :(得分:0)
线程中还有一个类似于@Jaiwo99 的解决方案。我们可以直接向 ObjectMapper 注册 JavaTime 模块
@Bean
public Object registerJavaTimeModuleForJackson(){
return new Object(){
@Autowired
private ObjectMapper objectMapper;
@PostConstruct
public void registerJavaTimeModuleForJackson(){
objectMapper.registerModule(new JavaTimeModule());
}
};
}
我使用的是 springboot 2.4.5