Регистрация пользовательского ResourceMethodInvocationHandler в Джерси
Я пытаюсь перехватить вызов ресурса после того, как JSON был разобран. Читая некоторые форумы и посты, я обнаружил, что могу сделать это, реализовав org.glassfish.jersey.server.spi.internal.ResourceMethodInvocationHandlerProvider. Сделав это, я застрял, пытаясь зарегистрировать мой провайдер CustomResourceMethodInvocationHandler, чтобы внутреннее устройство jersey/hk2 вызывало мой переопределенный публичный метод InvocationHandler create(Invocable invocable). Любая помощь приветствуется!
1 ответ
Давайте посмотрим на этот подход:
(Протестировано с сериализацией Джерси 2.10 и JSON)
==============
1) Реализация пользовательского ResourceMethodInvocationHandlerProvider
package com.example.handler;
import java.lang.reflect.InvocationHandler;
import org.glassfish.jersey.server.model.Invocable;
import org.glassfish.jersey.server.spi.internal.ResourceMethodInvocationHandlerProvider;
public class CustomResourceInvocationHandlerProvider implements
ResourceMethodInvocationHandlerProvider {
@Override
public InvocationHandler create(Invocable resourceMethod) {
return new MyIncovationHandler();
}
}
2) Реализовать пользовательский InvocationHandler
package com.example.handler;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class MyIncovationHandler implements InvocationHandler {
@Override
public Object invoke(Object obj, Method method, Object[] args)
throws Throwable {
// optionally add some logic here
Object result = method.invoke(obj, args);
return result;
}
}
3) Создайте собственный класс Binder и зарегистрируйте свой CustomResourceInvocationHandlerProvider
package com.example.handler;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.server.spi.internal.ResourceMethodInvocationHandlerProvider;
public class CustomBinder extends AbstractBinder {
@Override
protected void configure() {
// this is where the magic happens!
bind(CustomResourceInvocationHandlerProvider.class).to(
ResourceMethodInvocationHandlerProvider.class);
}
}
4) Дополнительно: установите точку останова в ResourceMethodInvocationHandlerFactory
Просто чтобы понять, как работает выбор ResourceMethodInvocationHandlerProvider в org.glassfish.jersey.server.model.internal.ResourceMethodInvocationHandlerFactory.
==============
Как вы можете видеть, наиболее важным является привязка вашего CustomResourceInvocationHandlerProvider.class к ResourceMethodInvocationHandlerProvider.class. После этого HK2 узнает о вашем провайдере, а также о вашем обработчике!
Надеюсь, я мог помочь.