JSF2.2 – @Inject dans un FacesConverter

By , 09/09/2014

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}" />

Leave a Reply


+ seven = 12

OfficeFolders theme by Themocracy