Джерси использует HK2 для защиты зависимостей. И HK2 имеет AOP поддержку . Один вариант для вашего варианта использования будет использовать эту поддержку АОП. Все, что вам нужно сделать, это реализовать MethodInterceptor
и InterceptionService
. В MethodInterceptor
вы можете получить все аргументы из MethodInvocation
и вы можете получить аннотацию параметра из Method
class MyMethodInteceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
Method method = invocation.getMethod();
Object[] args = invocation.getArguments();
// do your logging or whatever with the args.
// invoke method and get return value.
Object returnValue = invocation.proceed();
// if you want to do something with the return
// value before returning it, you can.
return returnValue;
}
}
Чтобы использовать перехватчик, вы настраиваете InterceptionService
.
public class MyInterceptionService implements InterceptionService {
private final static MethodInterceptor METHOD_INTERCEPTOR
= new MyMethodInterceptor();
private final static List<MethodInterceptor> METHOD_LIST
= Collections.singletonList(METHOD_INTERCEPTOR);
@Override
public Filter getDescriptorFilter() {
return BuilderHelper.allFilter();
}
@Override
public List<MethodInterceptor> getMethodInterceptors(Method method) {
// you implement shouldIntercept
if (shouldIntercept(method)) {
return METHOD_LIST;
}
return null;
}
@Override
public List<ConstructorInterceptor> getConstructorInterceptors(Constructor<?> constructor) {
return null;
}
}
Вы определяете, какой метод должен быть перехвачен в методе getMethodInterceptors()
. Если метод должен быть перехвачен, тогда вернуть список перехватчиков, в противном случае вернуть ноль. Обычный способ справиться с этим - создать пользовательскую аннотацию и просто аннотировать метод. В приведенном выше методе просто отметьте
if (method.isAnnotationPresent(YourAnno.class)) {
return METHOD_LIST;
}
Чтобы все это заработало, вам просто нужно зарегистрировать InteceptionService
в HK2. Вы можете сделать это в AbstractBinder
, который используется в приложении Джерси для настройки вашего DI.
ResourceConfig config = new ResourceConfig();
config.register(new AbstractBinder() {
@Override
protected void configure() {
bind(MyInterceptionService.class)
.to(InterceptionService.class)
.in(Singleton.class);
}
});
Вы можете увидеть полный пример в этом репозитории GitHub . Существует также официальный пример на сайте HK2. Просто посмотрите ссылку «Поддержка AOP» вверху поста.