J'ai deux classes, que je souhaite injecter:Sont des fonctions spéciales dans CDI w.r.t. @Inject vs BeanManager.getBeans (Function.class)?
@ApplicationScoped
public class BeanThing {
public String apply(String s) {
return "bt(" + s + ")";
}
}
et
@ApplicationScoped
public class ClassFunction implements Function<String, String> {
@Override
public String apply(String s) {
return "cf(" + s + ")";
}
}
Lorsque je tente de les utiliser ailleurs je reçois un comportement différent:
Set<Bean<?>> functions = beanManager.getBeans(Function.class);
for (Bean<?> untyped : functions) {
Bean<Function<String, String>> typed = (Bean<Function<String, String>>) untyped;
Function<String, String> function = beanManager.getContext(typed.getScope()).get(typed, beanManager.createCreationalContext(typed));
System.err.println(function.apply("beanManager"));
}
Set<Bean<?>> beanThings = beanManager.getBeans(BeanThing.class);
for (Bean<?> untyped : beanThings) {
Bean<BeanThing> typed = (Bean<BeanThing>) untyped;
BeanThing beanThing = beanManager.getContext(typed.getScope()).get(typed, beanManager.createCreationalContext(typed));
System.err.println(beanThing.apply("beanManager"));
}
System.err.println(injectedFunction.apply("injected"));
System.err.println(beanThing.apply("injected"));
System.err.println("injectedFunction is a function: " + (injectedFunction instanceof Function));
ma sortie est :
bt(beanManager)
cf(injected)
bt(injected)
injectedFunction is a function: true
qui est une ligne de moins que ce à quoi je m'attends.
Quelqu'un pourrait-il nous expliquer ce qui se passe ici?
Solution, grâce à Siliarus pour me mettre hors sur le droit chemin:
Set<Bean<?>> functions = beanManager.getBeans(new ParameterizedType() {
@Override
public Type[] getActualTypeArguments() {
return new Type[]{new WildcardType() {...}, new WildcardType() {...};
}
@Override
public Type getRawType() {
return Function.class;
}
});
Merci pour la réponse. Je demande au BeanManager parce que je veux savoir sur les autres Qualifiers sur le haricot, comme je suis sûr que vous avez deviné étant donné les types impliqués cela sera finalement un producteur retournant un lambda plutôt qu'une classe dédiée. Je ne sais toujours pas comment demander le gestionnaire de bean pour la fonction ,?>? –
Donc, en donnant au BM quelques informations de type utiles, ça allait. Je devais juste être très explicite, ParametrizedType, avec deux WildcardTypes comme argumentTypes. –
Heureux que vous l'ayez compris! :) – Siliarus