Java Jackson使用对象值反序列化JsonPatch

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();

我正在使用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();
    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");
}
}