Java Jackson使用对象值反序列化JsonPatch
我正在使用JsonPatch(JSR-374),并在我的Spring项目补丁端点中从Apache org.Apache.johnzon:johnzon core:1.2.4实现:Java Jackson使用对象值反序列化JsonPatch,java,json,spring,json-patch,Java,Json,Spring,Json Patch,我正在使用JsonPatch(JSR-374),并在我的Spring项目补丁端点中从Apache org.Apache.johnzon:johnzon core:1.2.4实现: @Bean @Primary public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper = builder.createXmlMapper(false).build();
@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) {...}
Jackson正确地反序列化了JsonPatch实例
但对于复杂值类型(对象):
异常被抛出
原因:com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造javax.json.JsonPatch
(不存在与默认构造类似的创建者):抽象类型需要映射到具体类型、具有自定义反序列化器或包含其他类型信息
在[源:(PushbackInputStream);行:1,列:1]
我发现JsonPatch(及其Apache JsonPatchImpl)能够处理复杂类型,因为JsonValue提到了JsonObject和ValueType.OBJECT,但我不知道如何指导Jackson正确反序列化
提前感谢您的任何建议或帮助 我使用JSR-364实现Json.createPatch完成了这一过程:
@PatchMapping("/settings")
public ResponseEntity<SettingsResponse> patchDefaultSettingsJsonP3(@RequestBody String patchString, Locale locale) {
try (JsonReader jsonReader = Json.createReader(new StringReader(patchString))) {
JsonPatch patch = Json.createPatch(jsonReader.readArray());
...
}
}
@PatchMapping(“/settings”)
public ResponseEntity patchDefaultSettingsJsonP3(@RequestBody String patchString,Locale){
try(JsonReader-JsonReader=Json.createReader(newstringreader(patchString))){
JsonPatch patch=Json.createPatch(jsonReader.readArray());
...
}
}
编辑:
通过将转换器注册为bean,我找到了更明智的解决方案。然后,Spring在内部负责反序列化
@Component
public class JsonPatchHttpMessageConverter extends AbstractHttpMessageConverter<JsonPatch> {
public JsonPatchHttpMessageConverter() {
super(MediaType.valueOf("application/json-patch+json"), MediaType.APPLICATION_JSON);
}
@Override
protected boolean supports(Class<?> clazz) {
return JsonPatch.class.isAssignableFrom(clazz);
}
@Override
protected JsonPatch readInternal(Class<? extends JsonPatch> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
try (JsonReader reader = Json.createReader(inputMessage.getBody())) {
return Json.createPatch(reader.readArray());
} catch (Exception e) {
throw new HttpMessageNotReadableException(e.getMessage(), inputMessage);
}
}
@Override
protected void writeInternal(JsonPatch jsonPatch, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
throw new NotImplementedException("The write Json patch is not implemented");
}
}
@组件
公共类JsonPatchHttpMessageConverter扩展了AbstractHttpMessageConverter{
公共JSONPATCHTTMPessageConverter(){
super(MediaType.valueOf(“application/json补丁+json”)、MediaType.application\u json);
}
@凌驾
受保护的布尔支持(类clazz){
返回JsonPatch.class.isAssignableFrom(clazz);
}
@凌驾
受保护的JsonPatch readInternal(ClassClass <代码> JSONPUMENT/CODE >没有任何参数的构造函数。所以Spring不能创建它的实例。考虑使用其他的类,然后复制DATA。JSONFAPH是接口。我猜您是指Apache IMP.JSONPATCHIPIMPL。也许其他JSR-74实现对反序列化复杂类型没有困难?
@PatchMapping("/settings")
public ResponseEntity<SettingsResponse> patchDefaultSettingsJsonP3(@RequestBody String patchString, Locale locale) {
try (JsonReader jsonReader = Json.createReader(new StringReader(patchString))) {
JsonPatch patch = Json.createPatch(jsonReader.readArray());
...
}
}
@Component
public class JsonPatchHttpMessageConverter extends AbstractHttpMessageConverter<JsonPatch> {
public JsonPatchHttpMessageConverter() {
super(MediaType.valueOf("application/json-patch+json"), MediaType.APPLICATION_JSON);
}
@Override
protected boolean supports(Class<?> clazz) {
return JsonPatch.class.isAssignableFrom(clazz);
}
@Override
protected JsonPatch readInternal(Class<? extends JsonPatch> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
try (JsonReader reader = Json.createReader(inputMessage.getBody())) {
return Json.createPatch(reader.readArray());
} catch (Exception e) {
throw new HttpMessageNotReadableException(e.getMessage(), inputMessage);
}
}
@Override
protected void writeInternal(JsonPatch jsonPatch, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
throw new NotImplementedException("The write Json patch is not implemented");
}
}