繁体   English   中英

Spring 引导 2 未序列化 LocalDateTime

[英]Spring Boot 2 not serializing LocalDateTime

我最近尝试使用 spring-boot 2 实现一个微服务。

现在,每当我尝试从我的 REST 服务返回包含java.time.LocalDateTime的 object 时,LocalDateTime 将被序列化为整数数组。 像这样:

{
  "id": "5bf1425f9f8de267f04b22ad",
  "description": "aaaaaarrrgggghhhhh",
  "timestamp": [
    2018,
    11,
    18,
    11,
    43,
    43,
    889000000
  ],
  "time": 2.25,
  ...
}

我尝试通过application.yml中的设置配置ObjectMapper

spring:
  jackson:
    serialization:
      write-dates-as-timestamps: false

但不起作用。 我还尝试通过 Spring 配置 class 配置新的 ObjectMapper,如下所示:

@Configuration
public class JacksonConfig {
  @Bean
  @Primary
  public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
    final ObjectMapper objectMapper = builder.build();
    objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    return objectMapper;
  }
}

我的配置被加载(调试器在断点处停止) - 只是它什么都不做。

我尝试手动将jackson依赖项(也适用于 jsr310 模块)添加到我的 pom.xml - 也没有任何运气。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
</dependency>

由于某种原因,Spring Boot 似乎忽略了我对 ObjectMapper 的任何尝试,并且它一直返回相同的结果。

application.yml com.fasterxml的日志级别设置为 DEBUG 也不会产生 output:

logging:
  level:
    com.fasterxml: DEBUG

我使用 Spring Boot 2.1.0-RELEASE 和 Jackson 2.9.7。

The basic pom file was generated from https://start.spring.io My project compiles for and runs on a Java 8 JVM.

这个答案是基于teppic对原帖的评论。

问题是由@EnableWebMVC在我的一个@Configuration类上引起的。 删除@EnableWebMVC立即解决了问题。

从你的评论我发现问题,你将@EnableWebMvc与sprongboot混合在一起。 事实证明,Spring Boot与标准的Spring MVC @EnableWebMvc不能很好地@EnableWebMvc 添加注释时会发生的情况是禁用spring boot autoconfiguration。

您必须为jackson添加jsr310支持:

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.4.0</version>
</dependency>

每个人都说@EnableWebMvc 是罪魁祸首。 但是,没有人用WebMvc说如何解决这个问题。

所以,要回答这个问题,是的,有一种方法可以通过不删除@EnableWebMvc 来解决这个问题。

在进入答案之前,让我们了解一些概念:

  • HttpMessageConverters -> 这些是将 Java 对象从 JSON/XML 转换为 JSON/XML 的那些
  • 默认情况下,Spring boot会添加以下转换器:
    1. ByteArrayHttpMessageConverter
    2. StringHttpMessageConverter
    3. 资源HttpMessageConverter
    4. SourceHttpMessageConverter
    5. FormHttpMessageConverter
    6. Jaxb2RootElementHttpMessageConverter
    7. 映射Jackson2XmlHttpMessageConverter
    8. 映射Jackson2HttpMessageConverter
  • So, whenever we are converting the java object into JSON, then spring will go through this list of converters one by one in order and picks the relevant one to convert
  • 现在,如果我们将自定义 MappingJackson2HttpMessageConverter 作为最后一个元素添加到此列表中,那么 spring 将不会出现,因为在到达我们的转换器(第 9 个元素)之前,第 7 个索引处有默认转换器
  • 所以,要解决这个问题,我们需要移除默认的 MappingJackson2HttpMessageConverte 并且需要添加我们的自定义转换器
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
//        Remove the default MappingJackson2HttpMessageConverter
        converters.removeIf(converter -> {
            String converterName = converter.getClass().getSimpleName();
            return converterName.equals("MappingJackson2HttpMessageConverter");
        });
//        Add your custom MappingJackson2HttpMessageConverter
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule());
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        converter.setObjectMapper(objectMapper);
        converters.add(converter);
        WebMvcConfigurer.super.extendMessageConverters(converters);
    }
}

注意:请不要使用 configureMessageConverters() 而不是来自 WebMvcConfigurer 的 extendMessageConverters() 因为 configure 方法将删除所有将默认安装的现有转换器。

希望它能帮助像我这样浪费了几个小时调试问题的人:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM