Я видел, что многие люди боролись с "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.