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