Jakarta ee 带有@Qualifier列表的CDI编程查找

Jakarta ee 带有@Qualifier列表的CDI编程查找,jakarta-ee,cdi,Jakarta Ee,Cdi,我正在寻找一种动态查找由注释列表注释的CDIBean的方法。 是否有一种优雅的方法来查找至少包含一个值的bean 这是我的注解: @Qualifier @Retention(RUNTIME) @Target({ METHOD, FIELD, PARAMETER, TYPE }) public @interface SelectEngine { ProfilUser profil(); Periodicite periodicite(); int annee();

我正在寻找一种动态查找由注释列表注释的CDIBean的方法。 是否有一种优雅的方法来查找至少包含一个值的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*/
}
@SelectEngine.List({
@选择引擎(profil=ProfilUser.CAS,annee=2016,periodicite=periodicite.MENSUELLE),
@选择引擎(profil=ProfilUser.COMMERCIAL,annee=2016,periodicite=periodicite.MENSUELLE)
})
公共级MoteurPMCOM2016实现MoteurPrime{
/*实施*/
}
在我以前版本的应用程序中,我使用了相同的注释,没有使用profil数组,并在实现中创建了@PRODUCTS方法,如下所示:

@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*/
}
@限定符
@保留(运行时)
@目标({方法,字段,参数,类型})
公共@interface SelectEngine{
ProfilUser profil();
Periodicite Periodicite();
int annee();
}
//cdibean实现
@选择引擎(profil=ProfilUser.COMMERCIAL,annee=2016,periodicite=periodicite.MENSUELLE)
公共级MoteurPMCOM2016实现MoteurPrime{
//对于profil=ProfilUser.CAS,我使用相同的实现
@产生
@选择引擎(profil=ProfilUser.CAS,annee=2016,periodicite=periodicite.MENSUELLE)
Casprofil的公共汽车发动机(@SelectEngine(profil=ProfilUser.COMMERCIAL,annee=2016,periodicite=periodicite.MENSUELLE)发动机){
返回引擎;
}
/*实施*/
}

谢谢大家!

您可以通过使用@products并在InjectionPoint解析注释来实现这一点。 不过,您必须以编程方式实例化实现,但这是一个解决方案


例如:

哼。。。我对这些bean使用动态查找,我不能使用.getAnnoted()方法,但我认为我可以使用.getQualifiers()。我将很快发布我的解决方案。