Jersey 2.11 и ResourceMethodInvocationHandlerProvider: MessageBodyWriter не найден - PullRequest
0 голосов
/ 25 октября 2018

Я видел, что многие люди боролись с "MessageBodyWriter not found", используя Jersey (2.11 для меня) для REST-сервера, но ни одна из их проблем, похоже, не связана с моим делом.

У меня былопростой метод 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);

Не возвращает ответ.Кажется, что именно в этом проблема.

Дело в том, что я хочу сделать «MyInterfaceImplemented» полностью доступным через веб-сервисы без необходимости изменять методы, возвращающие типы.Вот почему у меня была идея реализовать InvocationHandler, чтобы выступать в качестве прокси Java.

1 Ответ

0 голосов
/ 26 октября 2018

Решено.

Я думал, что

packagesResourceConfig.register(JacksonFeature.class);

и

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

будут как-то эквивалентны, но это не так.Второй исправил проблему (также в обработчике вызовов я должен возвращать сущность, а не ответ)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...