java - Jersey 2.11 和 ResourceMethodInitationHandlerProvider : MessageBodyWriter not found

标签 java jersey

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

我有一个简单的 REST 方法,一切正常。 然后我转向自定义 ResourceMethodInvocableHandlerProvider。

我实现ResourceMethodInitationHandlerProvider:

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

正如你所见,我给了他 MyInitationHandler,如下所示:

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 响应。

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

问候, Jade 潭婆/汤たんぽ

编辑:

更精确。调用的方法

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

不返回响应。看来问题就出在这里。

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

最佳答案

已解决。

我以为

packagesResourceConfig.register(JacksonFeature.class);

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

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

关于java - Jersey 2.11 和 ResourceMethodInitationHandlerProvider : MessageBodyWriter not found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52993772/

相关文章:

rest - 在 POST 操作期间在 Jersey 中捕获 SAXNotRecognizedException

java - 如何在没有 web.xml 的情况下应用 ContainerRequestFilter?

Java 函数作为对象

java - 在 Android 中运行方法时显示加载对话框?

java - 关于实现一次性密码系统,我还需要了解什么?

java.lang.ClassNotFoundException : org. codehaus.jettison.json.JSONException

Java EE - 如何使用自定义注释在方法上注入(inject)方法参数

java - 在java中播放声音

Java从XML保存/读取数据——解析异常

java - REST GET/POST如何发送和接收复杂参数?