java - 在 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
从成员中删除。
我不明白为什么这个解决方案有效。有人可以解释一下吗?
解决方案
只需使用以下命令注释构造函数@JsonCreator
:
@JsonCreator
public Foo(LocalDateTime start, LocalDateTime end) {
this.start = start;
this.end = end;
}
一旦你的日期使用了一种非常特殊的格式,你就需要编写一个自定义的反序列化器来处理它们。
如果您坚持ISO 8601,您可以依靠JavaTimeModule
:它将为您提供一组用于JSR-310数据类型的序列化器和反序列化器。
在此处查看详细信息。
推荐阅读
- python - functools 在切换到 Python 3 时停止工作
- android - Android-studio 无法在 Arch Linux 中安装系统镜像
- installation - Julia:无法在 Julia 中安装“Pkg”包
- foreign-keys - PowerApps:如何使用外键修补多个 SQL 表?
- angular6 - 如何使用角度 6 中的选择选项绑定对象数据?
- vuejs2 - 如何使用 VUE 禁用 Materialize CSS 中的选择元素?
- security - Anchore Engine - Jenkins CI 插件
- apache - htaccess 将特定语言的域重定向到新域
- flutter - 当前未查看时跳过重新构建重载小部件
- haskell - 如何将类型类约束添加到新类型表达式?