如何在全球范围内配置带弹簧的jackson?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在全球范围内配置带弹簧的jackson?相关的知识,希望对你有一定的参考价值。

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

@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.class)
private LocalDate openingDate 

如何将其设置为全局默认值,以便我不必将其添加到每个属性中?

使用XML配置。

答案

如果您使用的是基于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并将其设置为转换器。

另一答案

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

另一答案

那么你可以安装模块来使用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 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中所述

Jackson 1.7增加了通过Module接口注册序列化器和反序列化的功能。这是添加自定义序列化程序的推荐方法 - 所有序列化程序都被视为“通用”,因为它们用于子类型,除非找到更具体的绑定。

here

任何类型为com.fasterxml.jackson.databind.Module的bean都会自动注册自动配置的Jackson2ObjectMapperBuilder,并应用于它创建的任何ObjectMapper实例。这为您在应用程序中添加新功能时提供了一种提供自定义模块的全局机制。

以上是关于如何在全球范围内配置带弹簧的jackson?的主要内容,如果未能解决你的问题,请参考以下文章

无论如何要在全球范围内安装信条吗?

如何使指令和组件在全球范围内可用

Maven 构建错误 org.codehaus.jackson:jackson-core-asl:jar:[1.8,1.9) 在指定范围内没有可用的版本

如何使用我的 IP 地址使 localhost:3000 在全球范围内可用?

如何在全球范围内忽略具有恢复响应的 Null 字段?

Nexus Prisma - 如何在全球范围内使用 crud 处理 createdAt 和 updatedAt?