تكوين اعتراضية لاستخدامها لجميع cdi-beans داخل التطبيق

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 لاستخدام هذا التقاطع؟ أم أن هناك طريقة لتكوين 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.

سيكون قريبًا جزءًا من Codi Apache myfaces ، أحتاج فقط إلى العثور على بعض الوقت لتنظيف جزء التكوين أولاً ؛)

قد تتأخر هذه ، لكنني واجهت شرطًا كنت بحاجة إلى اعتراض عالمي/تطبيق واسع.

لتمكين اعتراض التطبيق ، قم بتعليق التقاطع على النحو التالي:

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

في هذه الحالة ، فإن الخبر السار هو أنك لست مضطرًا لإعلان المعترض في Beans.xml:

تعليمي Oracle Javaee7

جميع الفاصوليا ليست مفيدة. يمكنك معالجة الفاصوليا أثناء bootstrapping - على سبيل المثال Ultra_lite_ejbs في Codi -Addons (انظر Bitbucket org) يستخدمها. ربما يكون مصدر إلهام لك. IMHO على سبيل المثال ، سيكون مجتمع مثل OpenWebeans.Apache.org مناسبًا لأسئلتك المتعلقة بـ CDI.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top