JSF2.2 – @Inject dans un FacesConverter
Si vous avez déjà développé un FacesConverter, vous avez certainement compris qu’il n’est pas possible d’utiliser l’injection CDI dans ce type d’objet. Je vais donc transformer le simple converter suivant pour permettre l’injection :
@FacesConverter(value="monConverter") public class MonConverter implements Converter { @Override public Object getAsObject(FacesContext context, UIComponent component, String value) { // création d'un objet en fonction de la valeur à convertir return new MonObjet(value); } @Override public String getAsString(FacesContext context, UIComponent component, Object value) { // Exemple de version de l'objet en String return ((MonObjet) value).getValue(); } }
Tout d’abord, pour pouvoir injecter un objet et rendre le converter visible dans la vue XHTML, il faut remplacer l’annotation @FacesConverter par @Named. Puis Injecter l’objet souhaité :
//@FacesConverter(value="monConverter") @Named public class MonConverter implements Converter { // Injection possible dans ce cas @Inject private EntityManager em; @Override public Object getAsObject(FacesContext context, UIComponent component, String value) { // création d'un objet en fonction de la valeur à convertir return new MonObject(value); } @Override public String getAsString(FacesContext context, UIComponent component, Object value) { // Exemple de version de l'objet en String return ((MonObjet) value).getValue(); } }
Ensuite, une petite transformation de la vue est nécessaire pour faire appel à ce nouveau converter. On n’utilise plus l’identifiant du converter mais sa référence directement :
<!-- Avant avec l'ID--> <h:input... converter="monConverter" /> ou <f:converter converterId="monConverter" /> <!-- Après avec l'objet directement --> <h:input... converter="#{monConverter}" /> ou <f:converter binding="#{monConverter}" />