Spring Boot 2 没有序列化 LocalDateTime

Posted

技术标签:

【中文标题】Spring Boot 2 没有序列化 LocalDateTime【英文标题】:Spring Boot 2 not serializing LocalDateTime 【发布时间】:2019-04-21 05:34:48 【问题描述】:

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

现在,每当我尝试从我的 REST 服务返回一个包含 java.time.LocalDateTime 的对象时,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 Configuration 类配置新的 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 也不会产生任何输出:

logging:
  level:
    com.fasterxml: DEBUG

我将 Spring Boot 2.1.0-RELEASE 与 Jackson 2.9.7 一起使用。

基本的 pom 文件是从 https://start.spring.io 生成的,我的项目针对 Java 8 JVM 进行编译和运行。

【问题讨论】:

您是否尝试创建一个 ObjectMapper 而不是将构建器传递给方法 args 然后基于它构建一个新的? mapper = new ObjectMapper() 然后自定义 刚刚使用 spring-initializr 创建了一个演示项目,(Java 8、Maven、Web 支持)。除了添加一个控制器和一个具有 LocalDateTime 属性的简单类之外,我什么也没做,而且我无法重现。您确定没有其他依赖项会改变 Jackson 的配置吗? 您的@Configuration 课程中是否有@EnableWebMvc?如果是这样,请将其删除。它与配置spring mvc的spring boot方式斗争。 @JBNizet 我想你可能正在做一些事情。对于这个项目,我使用的是 mongodb - 可能是 spring-starter-mongo 序列化器/反序列化器是罪魁祸首 - 当我尝试删除它时我会回来。 @teppic +1 宾果游戏就是问题所在 - 现在我希望我的 Cors 配置仍然有效......太糟糕了,我不能接受您的回复作为解决方案。 :) 【参考方案1】:

此答案基于 teppic 对原帖的评论。

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

【讨论】:

谢谢!在没有“@EnableWebMVC”的情况下,我发现如果您在测试中手动初始化 MockMVC,也会发生这种情况。例如,MockMvcBuilders.standaloneSetup(controller)... 将“@AutoConfigureMockMvc”与自动连接的 MockMvc 一起使用可以解决此问题。【参考方案2】:

当您将 @EnableWebMvc 与 sprongboot 混合时,我从您的 cmets 中发现了问题。事实证明,Spring Boot 不能很好地与标准 Spring MVC @EnableWebMvc 混合使用。添加注释时会发生什么情况是禁用了 spring boot 自动配置。

【讨论】:

【参考方案3】:

你必须为 jackson 添加 jsr310 支持:

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

【讨论】:

看起来很有帮助。这不是我的家乡,但我的印象是它被jackson-modules-java8取代了?该链接确实包含 Spring 的依赖项。 应该写,我已经试过了。另外,我可以看到 jsr310 确实包含在一个临时依赖项中。

以上是关于Spring Boot 2 没有序列化 LocalDateTime的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 2 中使用内容协商建立自定义 xml 序列化

Spring Boot JSON 没有反序列化到我的请求模型中

为啥spring boot可以在没有默认构造函数的情况下反序列化类?

有没有办法让 Spring Boot 反序列化以反序列化测试中的对象?

Spring Boot:没有从字符串值反序列化的字符串参数构造函数/工厂方法

Spring Boot 2. Jackson json 序列化或 Spring Data JPA FetchType.Lazy