【问题标题】:CDI Programmatic lookup with a list of @Qualifier带有@Qualifier 列表的 CDI 程序化查找
【发布时间】:2016-02-27 09:29:08
【问题描述】:

我正在寻找一种方法来动态查找由注释列表注释的 CDI bean。 有没有一种优雅的方法来查找包含至少一个值的 bean?

这是我的注释:

@Qualifier
@Retention(RUNTIME)
@Target({ METHOD, FIELD, PARAMETER, TYPE })
public @interface SelectEngine {

    ProfilUser profil();

    Periodicite periodicite();

    int annee();

    @Qualifier
    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
    @Retention(RetentionPolicy.RUNTIME)
    @interface List {

        SelectEngine[] values();
    }
}

这里是一个实现示例:

@SelectEngine.List({
            @SelectEngine(profil = ProfilUser.CAS, annee = 2016, periodicite = Periodicite.MENSUELLE),
            @SelectEngine(profil = ProfilUser.COMMERCIAL, annee = 2016, periodicite = Periodicite.MENSUELLE)
})
public class MoteurPMCOM2016 implements MoteurPrime<RapportPrimeMensuelle> {
    /*implementation*/
}

在我以前版本的应用程序中,我使用了相同的注释,没有配置文件数组,并在实现中创建了一个 @Produces 方法,如下所示:

@Qualifier
@Retention(RUNTIME)
@Target({ METHOD, FIELD, PARAMETER, TYPE })
public @interface SelectEngine {

        ProfilUser profil();
        Periodicite periodicite();
        int annee();
}

//The CDI bean implementation    
@SelectEngine(profil = ProfilUser.COMMERCIAL, annee = 2016, periodicite = Periodicite.MENSUELLE)
public class MoteurPMCOM2016 implements MoteurPrime<RapportPrimeMensuelle> {

        //For profil = ProfilUser.CAS I use the same implementation
        @Produces
        @SelectEngine(profil = ProfilUser.CAS, annee = 2016, periodicite = Periodicite.MENSUELLE)
        public MoteurPrime<RapportPrimeMensuelle> forCASProfil( @SelectEngine(profil = ProfilUser.COMMERCIAL, annee = 2016, periodicite = Periodicite.MENSUELLE) engine) {
          return engine;
        }
/*implementation*/
}

谢谢!

【问题讨论】:

    标签: jakarta-ee cdi


    【解决方案1】:

    您可以通过使用 @Produces 并解析 InjectionPoint 处的注释来做到这一点。 虽然您必须以编程方式实例化实现,但这是一个解决方案。

    一个例子:https://martinsdeveloperworld.wordpress.com/2014/02/23/injecting-configuration-values-using-cdis-injectionpoint/

    【讨论】:

    • 嗯...我对那些 bean 使用动态查找,我不能使用 .getAnnoted() 方法,但我想我可以使用 .getQualifiers()。我会尽快发布我的解决方案。
    猜你喜欢
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    相关资源
    最近更新 更多