【发布时间】:2020-07-21 17:48:07
【问题描述】:
我在我的 Spring 项目 PATCH 端点中使用 JsonPatch (JSR-374) 和 Apache org.apache.johnzon:johnzon-core:1.2.4 的实现:
@Bean
@Primary
public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) {
ObjectMapper objectMapper = builder.createXmlMapper(false).build();
objectMapper.registerModule(new Jdk8Module());
objectMapper.registerModule(new JSR353Module());
return objectMapper;
}
控制器
@PatchMapping("/settings")
public ResponseEntity<SettingsResponse> patchSettings(@RequestBody JsonPatch patchDocument, Locale locale) {...}
用json请求一个简单的原子值
[
{ "op": "replace", "path": "/currency", "value": "EUR" },
{ "op": "test", "path": "/version", "value": 10 }
]
JsonPatch 实例被 Jackson 正确反序列化
但是对于复杂的值类型(对象):
[
{ "op": "replace", "path": "/currency", "value": {"code": "USD", "label": "US Dollar"} },
{ "op": "test", "path": "/version", "value": 10 }
]
抛出异常
原因:com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造
javax.json.JsonPatch的实例(不存在像默认构造那样的创建者):抽象类型要么需要映射到具体类型,要么具有自定义反序列化器,或包含其他类型信息 在 [来源:(PushbackInputStream);行:1,列:1]
我发现 JsonPatch(及其 Apache JsonPatchImpl)能够处理复杂类型,因为 JsonValue 提到了 JsonObject 和 ValueType.OBJECT,但我不知道如何指示 Jackson 正确反序列化
提前感谢您的任何建议或帮助!
【问题讨论】:
-
Class
JsonPatch没有没有参数的构造函数。所以 Spring 不能创建它的实例。考虑使用其他类来复制以下数据。 -
JsonPatch 是接口。我猜你的意思是Apache imp。 JsonPatchImpl。也许其他 JSR-374 实现在反序列化复杂类型方面没有困难?
标签: java json spring json-patch