2016-04-12 19 views
1

Java EE 7 uygulamasına parametreli bir günlüğe kaydetme engelleyicisi eklemeye çalışırken çok tuhaf bir sorun yaşıyorum.Java EE: Çok sayıda değerle ek açıklama yoluyla önleyiciyi bağlama girişiminde bulunma

Özel interceptor bağlaması yazmak için @Interceptors ek açıklamalarını kullanarak bir sınıf engelleyiciden gittim. Ne Benim yok

açıklama

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

    MethodLogger logLevel() default MethodLogger.INFO; 

} 

önleme

@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(); 
    } 

} 

bu her şey gibi kullanmak

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

Tamam çalışır kullanım ... Bu gibi görünüyor .

Al Ben loglevel değiştirmek kullanmak ve sonra benim avcı asla çağrılan

@LogMethodCall(logLevel=MethodLogger.DEBUG) 

kullanmayı deneyin.

Burada nelerin eksik? Ek açıklama değerini ayarlamak neden kodu bozar?

cevap

0

Eğer interceptor'unuzun sadece değer INFO olduğunda yakalandığını söylerseniz, logLevel() özniteliğinizi @Nonbinding olarak atamayı düşünebilirsiniz.

Varsayılan olarak, niteleyici argümanları, fasulye niteleyicileriyle enjeksiyon noktası niteleyicilerine eşleştirilmek üzere düşünülür. Eşleştirme için bir @Nonbinding bağımsız değişkeni dikkate alınmaz.

bu deneyin:

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

    @Nonbinding MethodLogger logLevel() default MethodLogger.INFO; 

} 
İlgili konular