web-dev-qa-db-fra.com

Injection CDI dans un facesconverter

À partir de quelques recherches, cela ressemble à un problème qui existe depuis un moment. J'ai écrit un facesconverter qui ressemble à ce qui suit. La catégorie Objet est une entité JPA et CatégorieControl est le dao qui va chercher ce.

@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é maintenant, je n'ai jamais l'injection. J'ai eu cette solution de 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 haricot de support crée et retourne un convertisseur d'accord, mais cela ne reçoit pas l'objet injecté.

J'utilise MyFaces Codi 1.0.1. Avec le conteneur de poisson-verre/soudure actuel. Quelqu'un peut-il suggérer une solution avant que je ne recoupe pas d'utiliser un convertisseur?

32
AlanObject

Remplacer

@FacesConverter(value = "categoryConverter")

par

@Named

et utilise

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

ou

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

à la place de

<h:inputSomething converter="categoryConverter" />

ou

<f:converter converterId="categoryConverter" />

Au fait, des problèmes similaires existent pour @EJB À l'intérieur d'un @FacesConverter. Cependant, il offre un moyen d'attraper manuellement JNDI. Voir aussi Communication dans JSF 2.0 - Obtenir une EJB dans @FacesConverter et @FacesValidator . De cette façon, vous pouvez utiliser une fonction @FacesConverter(forClass=Category.class) sans la définir manuellement à chaque fois. Malheureusement, je ne peux pas dire au sommet de la tête comment réaliser que pour les haricots CDI.


Mise à jour : Si vous utilisez une bibliothèque utilitaire JSF omnifaces , puisque la version 1.6 ajoute une prise en charge transparente pour l'utilisation @Inject et @EJB dans une classe @FacesConverter sans configuration ou annotations supplémentaires. Voir aussi le CDI @FacesConverter Exemple de vitrine .

62
BalusC

Les @Inject Annotation ne fonctionne que dans les instances gérées CDI. Si vous souhaitez utiliser des fonctionnalités CDI dans une instance gérée non-CDI (comme un validateur JSF ou un convertisseur JSF), vous pouvez simplement programmer 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/javae/7/api/javax/enterprise/Inject/spi/cdi.html

Avec tout l'annotationhell in Java EE, les gens oublient comment coder.

5

Il suffit d'utiliser @Anvanced of Codi pour votre @FacesConverter Voir le wiki .

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

3
Dar Whi

La réponse de Baluscs ici , j'ai décidé d'ajouter des haricots gérés JSF (DemandeCoped) qui contenaient uniquement @FacesConverter et convertisseur pour résoudre ce problème dans mon application, car je migre de haricots gérés JSF aux haricots gérés CDI. .

J'ai essayé Codi @Advancé contre @FacesConverter, mais cela n'injecte pas du tout la graine.

2
Howard