Регистрация пользовательского 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 узнает о вашем провайдере, а также о вашем обработчике!

Надеюсь, я мог помочь.

Другие вопросы по тегам