How to configure jackson with spring globally?

前端 未结 4 376
走了就别回头了
走了就别回头了 2021-01-20 12:47

To serialize deserialize object I am useing Jackson as flow

@JsonSerialize(using = LocalDateSerializer.class)
@JsonDeserialize(using = LocalDateDeserializer.         


        
相关标签:
4条回答
  • 2021-01-20 13:16

    With Spring Boot you can achieve this by registering new 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;
        }
    }
    

    As stated in documentation here

    Jackson 1.7 added ability to register serializers and deserializes via Module interface. This is the recommended way to add custom serializers -- all serializers are considered "generic", in that they are used for subtypes unless more specific binding is found.

    and here:

    Any beans of type com.fasterxml.jackson.databind.Module are automatically registered with the auto-configured Jackson2ObjectMapperBuilder and are applied to any ObjectMapper instances that it creates. This provides a global mechanism for contributing custom modules when you add new features to your application.

    0 讨论(0)
  • 2021-01-20 13:25

    Well you can install modules for using things like java datetime or jodatime. checkout this:

        @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);
        }
    
    0 讨论(0)
  • 2021-01-20 13:30

    You can use configure your serializers (providing fully qualified class name) in spring Jackson2ObjectMapperFactoryBean then bind it with MappingJackson2HttpMessageConverter. Here is an example XML configuration snippet:

    <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>
    

    The link to the documentation

    0 讨论(0)
  • 2021-01-20 13:41

    If you are using Java-based configuration, you can create your configuration class extending WebMvcConfigurerAdapter and do the following:

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

    In here, you can configure the ObjectMapper as you like and set it as a converter.

    0 讨论(0)
提交回复
热议问题