Настройте перехватчик, который будет использоваться для всех CDI-бобов внутри приложения

StackOverflow https://stackoverflow.com/questions/3674883

  •  01-10-2019
  •  | 
  •  

Вопрос

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

//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-bean:

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

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

Это было полезно?

Решение

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

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

}

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

Другие советы

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

https://github.com/struberg/interdyn.

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

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

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

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

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

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

Oracle Javaee7 Учебник

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top