【问题标题】:Using Spring MVC how do I add a custom JsonSerializer for a java 8 LocalDateTime?使用 Spring MVC 如何为 java 8 LocalDateTime 添加自定义 JsonSerializer?
【发布时间】:2016-02-23 16:35:52
【问题描述】:

我正在使用 Spring 4.1.6 创建一个 RESTful API。我使用 Spring Boot。我不想用@JsonSerialize(using = MyLocalDateTimeJsonSerializer.class) 注释我的每个资源,因为它添加了很多样板。相反,这应该是默认行为。

理想情况下,我想添加一些配置来获取我的自定义LocalDateTime 序列化程序,然后在整个过程中使用该序列化程序。我看到了一个示例,让我希望以下内容会起作用,但事实并非如此。

@Configuration
@EnableWebMvc
public class JacksonConfiguration extends WebMvcConfigurerAdapter {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
       Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder()
        .serializers(new LocalDateTimeJsonSerializer());
        converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
    }

}

public class LocalDateTimeJsonSerializer extends JsonSerializer<LocalDateTime> {

    @Override
    public void serialize(LocalDateTime localDateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
            throws IOException, JsonProcessingException {
        jsonGenerator.writeString("foo");
    }

    @Override
    public Class<LocalDateTime> handledType() {
        return LocalDateTime.class;
    }

}

我注意到 Spring 加载了 JSR310Module,它调用了正在使用的 addSerializer(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE)。会不会是在上面的例子之后注册的,所以优先考虑?

有没有办法让我的自定义 LocalDateTime 序列化器在整个代码中使用,而不使用 @JsonSerialize

编辑 Spring DI 没有选择基于注解的配置的原因是因为我的项目也有基于 xml 的配置,其中声明了 &lt;mvc:annotation-driven/&gt;

这似乎覆盖了带注释的类。从 xml 中删除它,扩展 WebMvcConfigurerAdapter 的配置类被组件扫描和使用。

【问题讨论】:

    标签: java spring spring-mvc jackson


    【解决方案1】:

    您可以将所有序列化器/反序列化器放在一个模块中,并将其公开为 com.fasterxml.jackson.databind.module.SimpleModule。 Spring 自动注册所有 Module 类型的 bean,并将使用它们来配置 ObjectMapper。 我正在使用以下代码并且它有效:

    @Component
    public class CommonsModule extends SimpleModule implements RegisterableModule {
        private static final long serialVersionUID = 1L;
        public CommonsModule() {
            addSerializer(LocalDateTime.class, 
    new LocalDateTimeJsonSerializer());
        }
    } 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-21
      • 2016-03-31
      • 1970-01-01
      • 2018-02-12
      • 2012-02-25
      • 1970-01-01
      • 2014-05-12
      • 2012-04-21
      相关资源
      最近更新 更多