2010-09-09 5 views
1

В моей 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-бобов, не объявляя его для каждого отдельного компонента?

ответ

2

Я не думаю, что вы можете. Однако вы можете сэкономить немного набрав с помощью стереотипов:

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

} 

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

0

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

2

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

https://github.com/struberg/InterDyn

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

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

1

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

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

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

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

Oracle javaee7 tutorial

+0

Это относится только к EE7, но не приносит никакой пользы –