2014-07-26 83 views
5

Chcę napisać przechwytywacz CDI. Przechwytywanie działa dobrze, jeśli moja adnotacja zawiera tylko jeden parametr, ale ulega przerwaniu, jeśli używane są 2 parametry. Pytanie brzmi: dlaczego?Interceptor języka Java EE CDI nie działa, gdy adnotacja ma parametry

Klasa przechwytujących:

@Monitored 
@Interceptor 
@Priority(APPLICATION) 
public class MonitoringInterceptor { 

    @AroundInvoke 
    public Object logInvocation(InvocationContext ctx) throws Exception { 
     LOGGER.error("METHOD CALLED!!!"); //this is not called when annotation has 2 parameters 
     return ctx.proceed(); 
    } 
} 

Adnotacja:

@InterceptorBinding 
@Target({TYPE, METHOD}) 
@Retention(RUNTIME) 
@Inherited 
public @interface Monitored { 
    public String layer() default "BUSINESS"; 
    public String useCase() default "N/A"; 
} 

Teraz interesująca część:

@Stateless 
public class MyBean { 

    //this does not work, why? 
    @Monitored(layer = "BUSINESS", useCase = "test") 

    //if I use the following annotation it works well 
    //@Monitored(layer = "BUSINESS") 
    public String sayHello(String message) { 
     return message; 
    } 
} 

wiem, że MyBean nie jest opatrzone @Interceptors. Jest to zamierzone. Interceptor jest zadeklarowana w beans.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" 
    bean-discovery-mode="all"> 
<interceptors> 
    <class>my.package.MonitoringInterceptor</class> 
</interceptors> 
</beans> 

Odpowiedz

6

Parametry są częścią wiązania. Albo zanotuj parametry za pomocą @Nonbinding, albo upewnij się, że te same wartości są używane zarówno dla przechwytywacza, jak i dla punktu przechwytywania.

+0

Dziękuję, po dodaniu '@ Nonbinding' do parametrów, które zadziałały. – flash