2016-04-12 5 views
1

У меня есть странная проблема с попыткой добавить параметризованный перехватчик протоколирования в мое приложение Java EE 7.Java EE: попытка связать перехватчик с помощью аннотации с несколькими значениями

Я перешел от класса-перехватчика с использованием аннотации @Interceptors к написанию пользовательского перехватчика перехватчика. То, что я не выглядит так ...

аннотаций

@Inherited 
@InterceptorBinding 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ 
     ElementType.TYPE, 
     ElementType.METHOD 
}) 
public @interface LogMethodCall { 

    MethodLogger logLevel() default MethodLogger.INFO; 

} 

Перехватчик

@Slf4j 
@LogMethodCall 
@Interceptor 
@Priority(Interceptor.Priority.APPLICATION) 
public class ActionInterceptor { 

    @AroundInvoke 
    protected Object protocolInvocation(final InvocationContext ic) throws Exception { 

     log.info(
       "{}: <{}> called. Parameters={}", 
       ic.getTarget().getClass().getName(), 
       ic.getMethod().getName(), 
       ic.getParameters()); 

     return ic.proceed(); 
    } 

} 

Использование

@GET 
    @Path("/{account}") 
    @LogMethodCall 
    public void inboxes(@Suspended AsyncResponse response, @PathParam("account") String account) { 
     ... 
    } 

Когда я использую его как это все работает нормально ,

Купить, когда я пытаюсь использовать изменить LOGLEVEL и использовать

@LogMethodCall(logLevel=MethodLogger.DEBUG) 

тогда мой перехватчик никогда не будет вызываться.

Что мне здесь не хватает? Почему установка значения аннотации нарушает код?

ответ

0

Если вы говорите, что ваш перехватчик ловит только тогда, когда значение INFO, вы можете считать, что ваш атрибут logLevel() является @Nonbinding.

По умолчанию аргументы-определители рассматриваются для сопоставления бонусных определителей с квалификаторами точки впрыска. Аргумент @Nonbinding не рассматривается для сопоставления.

Попробуйте это:

@Inherited 
@InterceptorBinding 
@Retention(RetentionPolicy.RUNTIME) 
@Target({ 
     ElementType.TYPE, 
     ElementType.METHOD 
}) 
public @interface LogMethodCall { 

    @Nonbinding MethodLogger logLevel() default MethodLogger.INFO; 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^