Настройте Interceptor для использования со всеми компонентами CDI внутри приложения - PullRequest
2 голосов
/ 09 сентября 2010

В моем JEE6-CDI-веб-приложении я объявил перехватчик безопасности, как этот:

//Secure.java
@Inherited
@Target({TYPE, METHOD})
@Retention(RUNTIME)
@InterceptorBinding
public @interface Secure
{}

//SecurityInterceptor.java
@Secure
@Interceptor
public class SecurityInterceptor
{
    @AroundInvoke
    protected Object invoke(InvocationContext ctx) throws Exception
    {
        // do stuff
        ctx.proceed();
    }
}

И объявил его в beans.xml:

//beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
      http://java.sun.com/xml/ns/javaee 
      http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
   <alternatives/>
   <decorators/>
   <interceptors>
     <class>com.profitbricks.security.SecurityInterceptor</class>
   </interceptors>
</beans>

Для использованияэто, я соответственно комментирую CDI-бин:

//CDI bean using Inteceptor
@Named @RequestScoped
@Secure
public class TestBean {
    public String doStuff() {
    }
}

Теперь я спрашиваю себя, должен ли я аннотировать ВСЕ мои CDI-бины, чтобы использовать этот перехватчик?Или есть способ настроить beans.xml для использования перехватчика для всех моих CDI-бинов, без необходимости объявлять его для каждого отдельного бина?

Ответы [ 4 ]

2 голосов
/ 03 февраля 2015

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

Чтобы включить перехватчик приложения, аннотируйте перехватчик как:

@Priority(Interceptor.Priority.APPLICATION)
@Interceptor
@Logging
public class MyLoggingInterceptor {}

В этом случае хорошей новостью является то, что вам не нужно объявлять перехватчик в beans.xml:

Учебник по Oracle javaee7

2 голосов
/ 13 сентября 2011

Вы можете попробовать использовать небольшое расширение CDI, которое я написал несколько месяцев назад:

https://github.com/struberg/InterDyn

Это позволит вам динамически применять CDI Interceptors к группе классов с помощью стиля regexp.

Скоро он станет частью Apache MyFaces CODI, мне просто нужно найти время для очистки части конфигурации;)

2 голосов
/ 09 сентября 2010

Не думаю, что ты можешь.Однако вы можете сэкономить немного времени на наборе текста, используя стереотипы:

@Named
@RequestScoped
@Secure
@Stereotype
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Secure {

}

, а затем аннотировать свои бобы только @Secure

0 голосов
/ 28 ноября 2010

Все бобы не полезны. Вы можете манипулировать бобами во время начальной загрузки - например, ultra_lite_ejbs в codi-addons (см. bitbucket org) использует его. Может быть, это вдохновение для вас. ИМХО, например такое сообщество, как openwebbeans.apache.org, лучше подойдет для ваших вопросов, связанных с CDI.

...