jsf selectmanylistbox converter example



Comment puis-je injecter dans @FacesConverter? (1)

Le @FacesConverter n'est pas une cible d'injection éligible. Remplacez-le par @ManagedBean ou @Named . Comme vous souhaitez également utiliser CDI, utilisez @Named .

@Named
@ApplicationScoped // I assume that your converter doesn't have any state.
public class MyConverter implements Converter {
    // ...
}

Vous avez seulement besoin de changer la façon dont il a été référencé dans les vues. Vous ne pouvez plus compter sur forClass . Vous devez le spécifier explicitement en tant que #{myConverter} .

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

ou

<h:inputSomething ...>
    <f:converter binding="#{myConverter}" />
</h:inputSomething>

Si vous avez vraiment besoin de garder @FacesConverter en faveur de forClass , vous devrez saisir l'EJB manuellement par JNDI. Un exemple concret est montré dans cet article de blog . Je ne peux cependant pas le dire pour les beans CDI.

Les gars de JSF ont confirmé cet oubli embarrassant et ils feront du @FacesConverter une cible d'injection admissible dans le JSF 2.2 à venir , voir aussi JSF spec issue 763 JSF 2.3.

Voir également:

Mise à jour si vous utilisez la bibliothèque OmniFaces de JSF, ou si vous êtes ouvert à l'utiliser, depuis sa version 1.6, lorsque vous avez simplement JAR OmniFaces dans /WEB-INF/lib , tous @FacesConverter s (et @FacesValidator s) dans votre webapp automatiquement devenir admissible à l'injection CDI et EJB sans effort supplémentaire.

J'ai écrit un convertisseur. J'utilise CDI et injection parallèle. Dans ce cas, les classes ne sont pas injectées. Comment puis-je rendre l'injection possible?

@FacesConverter(forClass = MyClass.class)

public class MyConverter implements Converter{

    @EJB
    private ClassForEJB classForEJB;

    @Inject
    private ClassForInject classForInject;

// Converter Methods
}




cdi