【问题标题】:java 8 dates come in as null in spring boot put requestjava 8日期在spring boot put请求中为null
【发布时间】:2018-05-09 14:22:55
【问题描述】:

我有一个休息端点,我想做一个放置请求。我放置的对象有几个字符串字段和一个 LocalDateTime。字符串通过就好了,但 LocalDateTime 字段为空。奇怪的是,它并没有给我一个“我们不能反序列化这个”错误。这是我的请求正文。

[
{
    "id": 2,
    "description": "test2",
    "modifyDate": "2018-05-07T16:13:04.597",
    "modifyUser": "me"
}

]

这是我的pojo的相关部分

@Column
LocalDateTime modifyDate;

这里是终点

@PUT
@Path("/putJobs")
@Consumes({MediaType.APPLICATION_JSON})
public Response create(@NotNull @Valid List<Job> jobs) {
    *my jobs object contains 1 job, with a null value for modifyDate*
}

这是我的主要课程

    @SpringBootApplication
@EnableCircuitBreaker
@EntityScan("whatever.pojos")
@ImportResource({"classpath*:/META-INF/**/spring-bootstrap.xml"})
@EnableJpaRepositories(basePackages="whatever.webservice", entityManagerFactoryRef="entityManagerFactory")
public class Application {


@Bean
    @Primary
    public ObjectMapper serializingObjectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new JavaTimeModule());
        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        return objectMapper;
    }

最后,这是我的 jackson java 8 依赖项

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.9.5</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.8.4</version>
</dependency>

【问题讨论】:

  • 该端点与 Spring 或 Spring Boot 无关。它是 Jersey 端点,而不是 Spring。您需要正确配置 Jersey。
  • 很好,我已经添加了适当的标签。我们在这里同时使用 spring 和 Jersey,框架的拼凑变得令人困惑:/

标签: spring-boot jackson jersey jax-rs


【解决方案1】:

不清楚你是实现了LocalDateTimeDeserializerLocalDateTimeSerializer 还是从某个地方导入了它们。

使用jackson-datatype-jsr310 模块后,请从LocalDateTime 字段中删除@JsonDeserialize@JsonSerialize 注释,让Jackson 为您处理。这个模块会给你一个LocalDateTimeSerializer和一个LocalDateTimeDeserializer

只需确保在 ObjectMapper 实例中注册 JavaTimeModule 并禁用 WRITE_DATES_AS_TIMESTAMPS

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

有关详细信息,请参阅documentation

【讨论】:

  • 我已经从 pojo 中删除了注释,并使用我的 Configuration 类中的 ObjectMapper bean 更新了问题。不过还是没有运气
  • @Steve 你用的是泽西岛?如果是这样,您可能想尝试使用ContextResolver 替换ObjectMapper。请参阅此answer。还要确保您的依赖项中有jersey-media-json-jackson。你也可能有一个扩展 ResourceConfig 的类,用 @Component 注释。您可以使用@Provider 注释ContextResolver 实现或将其注册到ResourceConfig 子类中。
  • Spring Boot 不需要 ContextResolver。 ObjectMapper bean 就足够了。 Spring Boot 有它自己的 ContextResolver,它注册并获取我们的 ObjectMapper。而且 Spring Boot 已经使用 jersey-media-json-jackson。
  • @PaulSamsotha 这就是我的想法。所有不同的框架和版本都非常令人困惑。你对我错过了什么有什么想法吗?
  • @Steve 我唯一能想到的是你的 setter 命名不正确。
猜你喜欢
  • 2021-01-10
  • 2017-07-29
  • 2019-10-23
  • 1970-01-01
  • 2020-11-27
  • 2014-05-15
  • 1970-01-01
  • 2018-05-18
  • 1970-01-01
相关资源
最近更新 更多