泽西2.11和ResourceMethodInvocationHandlerProvider:未找到MessageBodyWriter

时间:2018-10-25 16:10:21

标签: java jersey

我看到很多人在使用Jersey(对于我来说是2.11)作为REST服务器的“找不到MessageBodyWriter”方面感到困惑,但是他们的问题似乎都与我的情况无关。

我有一个简单的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条回复。

您是否知道可能是什么原因? 谢谢。

关于, Yutanpo /汤たんぽ

编辑:

更精确。提倡的方法

Object ret = method.invoke(target , args);

不返回响应。看来这就是问题所在。

问题是我想通过Web服务使“ MyInterfaceImplemented”完全可用,而不必修改其方法的返回类型。 这就是为什么我想到实现InvocationHandler来充当Java代理的原因。

1 个答案:

答案 0 :(得分:0)

已解决。

我以为

packagesResourceConfig.register(JacksonFeature.class);

res.add(JacksonJaxbJsonProvider.class);
ResourceConfig packagesResourceConfig = new ResourceConfig(res);

在某种程度上是等效的,但事实并非如此。第二个解决了这个问题(同样在调用处理程序中,我必须返回实体,而不是响应)