首页 > 解决方案 > 在 POST 请求中反序列化 LocalDateTime 时出错

问题描述

我有一个包含两个 LocalDateTime 成员的类:

public class Foo
{
    private final LocalDateTime start;
    private final LocalDateTime end;

    public Foo(LocalDateTime start, LocalDateTime end)
    {
        this.start = start;
        this.end = end;
    }
}

我有一个 Spring Boot 控制器来处理 POST 请求:

@PostMapping(value = "/my-resource")
public ResponseEntity<?> bar(@RequestBody Foo foo)
{
   return ResponseEntity.ok().build();
}

如果我按如下方式发送 POST 请求:

curl -X POST \
  http://localhost:8080/my-resource \
  -H 'Content-Type: application/json' \
  -d '{
    "start":[2016, 1, 1, 10, 24],
    "end":[2016, 1, 1, 10, 24]
}
'

返回以下错误:

"message": "Type definition error: [simple type, class Foo]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `Foo` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)\n at [Source: (PushbackInputStream); line: 2, column: 2]"

经过一番挖掘后,我向 Foo 添加了一个默认 ctor 并解决了错误。我也不得不final从成员中删除。

我不明白为什么这个解决方案有效。有人可以解释一下吗?

标签: javarestspring-bootjackson

解决方案


只需使用以下命令注释构造函数@JsonCreator

@JsonCreator
public Foo(LocalDateTime start, LocalDateTime end) {
    this.start = start;
    this.end = end;
}

一旦你的日期使用了一种非常特殊的格式,你就需要编写一个自定义的反序列化器来处理它们。


如果您坚持ISO 8601,您可以依靠JavaTimeModule:它将为您提供一组用于JSR-310数据类型的序列化器和序列化器。

在此处查看详细信息。


推荐阅读