Injection du CDI dans un convertisseur de visage
D'après quelques recherches, cela semble être un problème qui existe depuis un certain temps. J'ai écrit un FacesConverter qui ressemble à ce qui suit. L'objet catégorie est une entité JPA et CategoryControl est le DAO qui le récupère.
@FacesConverter(value = "categoryConverter")
public class CategoryConverter implements Converter {
@Inject private CategoryControl cc;
public CategoryConverter() { }
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (cc != null) return cc.getByName(value);
System.out.println("CategoryConverter().getAsObject(): no injection!");
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (!(value instanceof Category)) return null;
return ((Category) value).getName();
}
}
Comme vous l'avez probablement deviné, je n'ai jamais eu l'injection. J'ai eu ce contournement de cette page , qui ressemble à ceci.:
Workaround for this problem: create this method in your localeController:
public Converter getConverter()
{
return FacesContext.getCurrentInstance().getApplication().createConverter("localeConverter");
}
and use converter="#{localeController.converter}" in your h:selectOneMenu.
cependant je ne peux pas faire ce travail non plus. Mon support crée et retourne un convertisseur, mais il ne reçoit pas l'objet injecté.
j'utilise MyFaces CODI 1.0.1. Avec le container GlassFish/Weld actuel. Est-ce que quelqu'un peut suggérer une solution avant que je RE-code pour ne pas utiliser un convertisseur?
4 réponses
remplacer
@FacesConverter(value = "categoryConverter")
par
@Named
et utilisation
<h:inputSomething converter="#{categoryConverter}" />
ou
<f:converter binding="#{categoryConverter}" />
au lieu de
<h:inputSomething converter="categoryConverter" />
ou
<f:converter converterId="categoryConverter" />
soit dit en passant, un problème similaire existe pour @EJB
à l'intérieur d'un @FacesConverter
. Il offre cependant un moyen d'être saisi par JNDI manuellement. Voir Aussi Communication dans JSF 2.0 - Obtenir un EJB dans @FacesConverter et @FacesValidator . De cette façon, vous pouvez utiliser un @FacesConverter(forClass=Category.class)
sans le définir manuellement à chaque fois. Malheureusement, je ne peux pas dire du haut de la tête comment se rendre compte que pour les haricots CDI.
mise à jour : si vous utilisez la bibliothèque utilitaire JSF OmniFaces , car la version 1.6 ajoute un support transparent pour l'utilisation de @Inject
et @EJB
dans un Classe @FacesConverter
sans aucune configuration ou annotations supplémentaires. Voir aussi le CDI @FacesConverter
vitrine "exemple de 1519270920" .
L'Annotation @Inject
ne fonctionne que dans les instances gérées par le CDI. Si vous souhaitez utiliser les fonctionnalités du CDI dans une instance non gérée par le CDI (comme un validateur JSF ou un convertisseur JSF), vous pouvez simplement programmer avec L'API CDI.
cela ne fonctionne que dans au moins Java EE 7 + CDI 1.1 server.
@FacesValidator("userNameValidator")
public class UserNameValidator implements Validator {
private UserService userService;
public UserNameValidator(){
this.userService = CDI.current().select(UserService.class).get();
}
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
....
}
}
https://docs.oracle.com/javaee/7/api/javax/enterprise/inject/spi/CDI.html
avec tous les AnnotationHell en Java EE les gens oublient comment coder.
Par BalusC la réponse de ici , j'ai décidé d'ajouter de JSF (requestscoped) géré les haricots qui ne contenait @FacesConverter et Convertisseur pour résoudre ce problème dans mon application, depuis que je suis la migration de JSF géré haricots CDI géré les haricots.
j'ai essayé CODI @Advanced contre @FacesConverter, mais il n'injecte pas la fève du tout.