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?

25
demandé sur BalusC 2011-09-23 19:35:33

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" .

54
répondu BalusC 2014-06-05 07:32:21

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.

5
répondu Surprised Coconut 2015-10-08 13:54:52

juste utiliser @avancé de CODI pour votre @FacesConverter voir le Wiki .

dès Qu'un convertisseur ou un validateur est annotée avec @Avancé, il est possible d'utiliser @Inject.

3
répondu Dar Whi 2015-02-05 07:49:02

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.

2
répondu Howard 2017-05-23 12:26:35