Java 如何使用spring全局配置jackson?

Java 如何使用spring全局配置jackson?,java,spring,jackson,Java,Spring,Jackson,要序列化反序列化对象,我使用Jackson作为流 @JsonSerialize(using = LocalDateSerializer.class) @JsonDeserialize(using = LocalDateDeserializer.class) private LocalDate openingDate 如何使其成为全局默认值,从而不必将其添加到每个属性 使用XML配置 如果您使用的是基于Java的配置,则可以创建扩展WebMVCConfigureAdapter的配置类,并执行以

要序列化反序列化对象,我使用Jackson作为流

@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
private LocalDate openingDate 
如何使其成为全局默认值,从而不必将其添加到每个属性


使用XML配置

如果您使用的是基于Java的配置,则可以创建扩展WebMVCConfigureAdapter的配置类,并执行以下操作:

@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);
}
@覆盖

public void configureMessageConverters(List您可以安装使用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);
    }

您可以在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>


对于使用Spring Boot的文档

,您可以通过注册新的
模块
来实现这一点

@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;
    }
}
如文件所述

Jackson 1.7增加了通过 模块接口。这是添加自定义的推荐方法 序列化程序——所有序列化程序都被视为“泛型”,因为它们 用于子类型,除非找到更具体的绑定

以及:

任何类型为
com.fasterxml.jackson.databind.Module
的bean都是 自动注册到自动配置的
Jackson2ObjectMapperBuilder
并应用于任何
ObjectMapper
它创建的实例。这为 在向应用程序中添加新功能时提供自定义模块 应用程序


在线程中还有一个类似于@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