Jersey 2.11 和 ResourceMethodInvocationHandlerProvider:找不到 MessageBodyWriter
Jersey 2.11 and ResourceMethodInvocationHandlerProvider : MessageBodyWriter not found
我看到很多人在 "MessageBodyWriter not found" 使用 Jersey(对我来说是 2.11)作为 REST 服务器时遇到了困难,但是 none 他们的问题似乎与我的案例有关。
我有一个简单的 REST 方法,一切正常。
然后我转到自定义 ResourceMethodInvocationHandlerProvider。
我实现了 ResourceMethodInvocationHandlerProvider:
public class MyResourceHandlerProvider implements ResourceMethodInvocationHandlerProvider{
public void someMethodInvokedEarly() {
Set<Class<?>> res = new HashSet<Class<?>>();
res.add(some.package.MyInteface.class);
res.add(some.package.MyException.class);
ResourceConfig packagesResourceConfig = new ResourceConfig(res);
packagesResourceConfig.register(JacksonFeature.class);
packagesResourceConfig.registerInstances(new org.glassfish.hk2.utilities.binding.AbstractBinder() {
@Override
protected void configure() {
bind(MyResourceHandlerProvider.class).to(ResourceMethodInvocationHandlerProvider.class);
}
});
}
@Override
public InvocationHandler create(Invocable arg0) {
return new MyInvocationHandler();
}
}
如你所见,我给他的 MyInvocationHandler 是这样的:
public class MyInvocationHandler implements InvocationHandler {
final MyIntefaceImplemented target = GlobalItems.myIntefaceImplementedInstance;
public MyInvocationHandler() {
Class<?>[] clazz = new Class<?>[1];
clazz[0] = some.package.MyInterface.class;
}
@Override
public Object invoke(Object obj, Method method, Object[] args)
throws Throwable {
GenericEntity entity = null;
Object ret = method.invoke(target , args);
if(ret instanceof List<?>) {
entity = new GenericEntity<List>((List)p) {};
}
return Response.status(Status.OK).entity(entity).type(MediaType.APPLICATION_JSON).build();
}
}
如果我不执行此操作,我会收到一个响应 200,正文格式正确。
但是当我完成这个时,我得到一个
GRAVE: MessageBodyWriter not found for media type=text/xml, type=class org.glassfish.jersey.message.internal.OutboundJaxrsResponse, genericType=java.util.List<java.lang.String>.
我相信依赖项/注册不是问题,因为我之前收到了 200 响应。
您知道可能是什么原因吗?
谢谢。
此致,
玉坛坡/汤たんぽ
编辑:
更精确。被调用的方法
Object ret = method.invoke(target , args);
没有 return 响应。看来问题就出在这里了。
问题是我想通过 Web 服务使 "MyInterfaceImplemented" 完全可用,而无需修改其方法 return 类型。
这就是为什么我有实施 InvocationHandler 的想法,充当 Java 代理。
已解决。
我以为
packagesResourceConfig.register(JacksonFeature.class);
和
res.add(JacksonJaxbJsonProvider.class);
ResourceConfig packagesResourceConfig = new ResourceConfig(res);
在某种程度上是等效的,但它们不是。第二个解决了问题(也在调用处理程序中我必须 return 实体,而不是响应)
我看到很多人在 "MessageBodyWriter not found" 使用 Jersey(对我来说是 2.11)作为 REST 服务器时遇到了困难,但是 none 他们的问题似乎与我的案例有关。
我有一个简单的 REST 方法,一切正常。 然后我转到自定义 ResourceMethodInvocationHandlerProvider。
我实现了 ResourceMethodInvocationHandlerProvider:
public class MyResourceHandlerProvider implements ResourceMethodInvocationHandlerProvider{
public void someMethodInvokedEarly() {
Set<Class<?>> res = new HashSet<Class<?>>();
res.add(some.package.MyInteface.class);
res.add(some.package.MyException.class);
ResourceConfig packagesResourceConfig = new ResourceConfig(res);
packagesResourceConfig.register(JacksonFeature.class);
packagesResourceConfig.registerInstances(new org.glassfish.hk2.utilities.binding.AbstractBinder() {
@Override
protected void configure() {
bind(MyResourceHandlerProvider.class).to(ResourceMethodInvocationHandlerProvider.class);
}
});
}
@Override
public InvocationHandler create(Invocable arg0) {
return new MyInvocationHandler();
}
}
如你所见,我给他的 MyInvocationHandler 是这样的:
public class MyInvocationHandler implements InvocationHandler {
final MyIntefaceImplemented target = GlobalItems.myIntefaceImplementedInstance;
public MyInvocationHandler() {
Class<?>[] clazz = new Class<?>[1];
clazz[0] = some.package.MyInterface.class;
}
@Override
public Object invoke(Object obj, Method method, Object[] args)
throws Throwable {
GenericEntity entity = null;
Object ret = method.invoke(target , args);
if(ret instanceof List<?>) {
entity = new GenericEntity<List>((List)p) {};
}
return Response.status(Status.OK).entity(entity).type(MediaType.APPLICATION_JSON).build();
}
}
如果我不执行此操作,我会收到一个响应 200,正文格式正确。
但是当我完成这个时,我得到一个
GRAVE: MessageBodyWriter not found for media type=text/xml, type=class org.glassfish.jersey.message.internal.OutboundJaxrsResponse, genericType=java.util.List<java.lang.String>.
我相信依赖项/注册不是问题,因为我之前收到了 200 响应。
您知道可能是什么原因吗? 谢谢。
此致, 玉坛坡/汤たんぽ
编辑:
更精确。被调用的方法
Object ret = method.invoke(target , args);
没有 return 响应。看来问题就出在这里了。
问题是我想通过 Web 服务使 "MyInterfaceImplemented" 完全可用,而无需修改其方法 return 类型。 这就是为什么我有实施 InvocationHandler 的想法,充当 Java 代理。
已解决。
我以为
packagesResourceConfig.register(JacksonFeature.class);
和
res.add(JacksonJaxbJsonProvider.class);
ResourceConfig packagesResourceConfig = new ResourceConfig(res);
在某种程度上是等效的,但它们不是。第二个解决了问题(也在调用处理程序中我必须 return 实体,而不是响应)