Java 使用JAX-RS和Liferay(Apache CXF)实现修补程序端点
我正在尝试在Liferay OSGi模块中使用JAX-RS实现一个补丁端点。GET、POST和PUT端点工作正常,但我仍然坚持使用补丁端点。因为我不知道还有什么更好的方法,我正在尝试使用Daan Scheerens的方法 到目前为止,我的(简化)实现从控制器开始: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.
@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;
}