Java 使用JAX-RS和Liferay(Apache CXF)实现修补程序端点

Java 使用JAX-RS和Liferay(Apache CXF)实现修补程序端点,java,jax-rs,liferay,cxf,Java,Jax Rs,Liferay,Cxf,我正在尝试在Liferay OSGi模块中使用JAX-RS实现一个补丁端点。GET、POST和PUT端点工作正常,但我仍然坚持使用补丁端点。因为我不知道还有什么更好的方法,我正在尝试使用Daan Scheerens的方法 到目前为止,我的(简化)实现从控制器开始: @Path("/resources") public class ResourceController { @PATCH @Path("/{resourceId}") @Consumes(MediaType.

我正在尝试在Liferay OSGi模块中使用JAX-RS实现一个补丁端点。GETPOSTPUT端点工作正常,但我仍然坚持使用补丁端点。因为我不知道还有什么更好的方法,我正在尝试使用Daan Scheerens的方法

到目前为止,我的(简化)实现从控制器开始:

@Path("/resources")
public class ResourceController {

    @PATCH
    @Path("/{resourceId}")
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    Response patchResource(@PathParam("resourceId") long resourceId, ObjectPatch objectPatch) {

        // Get the resource
        Resource resource = getResource(resourceId);

        // Apply the patch
        objectPatch.apply(resource);

        // Return the resource
        return Response.ok(resource).build();
    }
}
所以我需要一个
ObjectPatch
接口,就像Daan的例子一样:

public interface ObjectPatch {

    <T> T apply(T target) throws ObjectPatchException;

}
如果我现在对端点执行修补程序请求,则会显示以下错误消息:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造
com.example.ObjectPatch
(不存在与默认构造类似的创建者):抽象类型需要映射到具体类型,具有自定义反序列化器,或包含其他类型信息

我有点理解错误消息,因为接口不能被实例化,但我不理解为什么我会得到这个消息。它是否应该尝试实例化
PartialJsonObjectPatch
而不是
ObjectPatch
?如果我将
patchResource()
方法的参数类更改为
PartialJsonObjectPatch
(我不应该这样做),我会收到以下错误消息:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造
com.example.PartialJsonObjectPatch
(不存在与默认构造类似的创建者):无法从对象值反序列化(无委托或基于属性的创建者)

错误消息导致我返回,但添加默认构造函数没有帮助


我缺少什么?

提供程序的
注释不够,我必须将我的
MessageBodyReader
实现添加到应用程序类中的单例:

    @Override
    public Set<Object> getSingletons() {

        Set<Object> singletons = new HashSet<>();

        // All your other Providers, Readers, Writers, e.g:
        singletons.add(new JacksonJaxbJsonProvider());

        // My MessageBodyReader implementation
        singletons.add(new PartialJsonObjectPatchReader());

        return singletons;
    }
@覆盖
公共集getSingleton(){
Set singleton=newhashset();
//所有其他供应商、读者、作者,例如:
add(新的JacksonJaxbJsonProvider());
//我的MessageBodyReader实现
add(新的PartialJsonObjectPatchReader());
返回单身人士;
}

请更清楚地解释。
public class PartialJsonObjectPatch implements ObjectPatch {

    private final ObjectMapper objectMapper;
    private final JsonNode patch;

    public PartialJsonObjectPatch(ObjectMapper objectMapper, JsonNode patch) {

        this.objectMapper = objectMapper;
        this.patch = patch;
    }

    @Override
    public <T> T apply(T target) throws ObjectPatchException {

        ObjectReader reader = objectMapper.readerForUpdating(target);

        try {
            return reader.readValue(patch);
        } catch (IOException e) {
            throw new ObjectPatchException(e);
        }
    }

}
    @Override
    public Set<Object> getSingletons() {

        Set<Object> singletons = new HashSet<>();

        // All your other Providers, Readers, Writers, e.g:
        singletons.add(new JacksonJaxbJsonProvider());

        // My MessageBodyReader implementation
        singletons.add(new PartialJsonObjectPatchReader());

        return singletons;
    }