2016-04-12 11 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) { 
     ... 
    } 

このすべてがOK作品のように、私はそれを使用していません。

購入私は、ログレベルを変更して、私のインターセプターが呼ばれることは決してありません

@LogMethodCall(logLevel=MethodLogger.DEBUG) 

を使用使用してみてください。

私はここで何が欠けていますか?なぜアノテーションの値を設定するとコードが壊れますか?

答えて

0

値がINFOの場合にのみインターセプタがキャッチしていると言えば、logLevel()属性を@Nonbindingにすることが考えられます。

デフォルトでは、修飾子引数は、注入点修飾子と一致するBean修飾子のために考慮されます。 @Nonbinding引数はマッチングのために考慮されません。

これを試してみてください:

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

    @Nonbinding MethodLogger logLevel() default MethodLogger.INFO; 

} 
関連する問題