jsf 2 selectmanylistbox CDI Injection dans un FacesConverter




jsf selectmanylistbox converter example (4)

La réponse de BalusC here , j'ai décidé d'ajouter des beans gérés JSF (requestscoped) qui contenaient seulement @FacesConverter et Converter pour résoudre ce problème dans mon application, puisque je migre des beans gérés par JSF vers des beans gérés par CDI.

J'ai essayé CODI @Advanced contre @FacesConverter, mais il n'injecte pas du tout de bean.

À partir de 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 Category 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 ne reçois jamais l'injection. J'ai cette solution à partir 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 haricot crée et renvoie un convertisseur, mais l'objet ne lui est pas injecté.

J'utilise MyFaces CODI 1.0.1. Avec le conteneur actuel GlassFish / Weld. Quelqu'un peut-il suggérer une solution avant de re-coder pour ne pas utiliser un convertisseur?


Remplacer

@FacesConverter(value = "categoryConverter")

par

@Named

et utilise

<h:inputSomething converter="#{categoryConverter}" />

ou

<f:converter binding="#{categoryConverter}" />

au lieu de

<h:inputSomething converter="categoryConverter" />

ou

<f:converter converterId="categoryConverter" />

Par ailleurs, un problème similaire existe pour @EJB dans un @FacesConverter . Il offre cependant un moyen d'être saisi manuellement par JNDI. Voir aussi Communication dans JSF 2.0 - Obtention d'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 réaliser cela pour les haricots CDI.

Mise à jour : si vous utilisez la bibliothèque OmniFaces de l' utilitaire JSF, depuis la version 1.6, vous bénéficiez d'un support transparent pour l'utilisation de @Inject et @EJB dans une classe @FacesConverter sans configuration ou annotations supplémentaires. Voir aussi l'exemple de CDI @FacesConverter .


Il suffit d'utiliser @Advanced de CODI pour votre @FacesConverter voir le Wiki .

Dès qu'un convertisseur ou un validateur est annoté avec @Advanced, il est possible d'utiliser @Inject.


L'annotation @Inject ne fonctionne que dans les instances gérées par CDI. Si vous souhaitez utiliser les fonctionnalités CDI à l'intérieur d'une instance gérée non-CDI (comme un validateur JSF ou un convertisseur JSF), vous pouvez simplement programmer sur l'API CDI.

Cela ne fonctionne que sur au moins le serveur Java EE 7 + CDI 1.1.

@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 dans Java EE, les gens oublient comment coder.





myfaces