Converter JSF

E' importante che tutti i dati che arrivano al server dal layer di interfaccia  siano sottoposti ad un controllo formale prima di essere utilizzati per valorizzare gli attributi di presenti nelle nostre classi java.
JSF fornisce una serie di converters standard che coprono l'esigenza della conversione per tutti i tipi base del linguaggio Java quali Byte, Character, Integer, Short, Double, Float, Long BigDecimal, BigInteger, Boolean Character.
Ci sono diversi modi di utilizzare i Converters in JSF, uno di questi è utilizzarlo come attributo di un campo di input o di output ad esempio:


<h:outputText value="#{personeList.codiceFiscale}" converter="codice"/>

Tuttavia possiamo utilizzare il tag <f:converter> innestato nel tag del componente al quale si riferisce nel seguente modo:

<h:outputText value="#{personeList.codiceFiscale}">
<f:converter converterId="codice"/>
</h:outputText>
 
Il converter deve essere dichiarato nel  faces-config.xml:
 


<converter>
<converter-id>cap</converter-id>
<converter-class>it.converters.codice</converter-class>
</converter>
 
Un convertitore è una classe che implementa l'interfaccia javax.faces.convert.Converter che definisce i metodi


public Object getAsObject(FacesContext facesContext,UIComponent uIComponent, String string)
throws ConverterException;


public String getAsString(FacesContext facesContext,UIComponent uIComponent, Object object)
throws ConverterException;

ecco un esempio di un BighdecimalConverter.java:



public class BigDecimalConverter implements Converter {
     BigDecimal number = BigDecimal.ZERO;

    public Object getAsObject(FacesContext context, UIComponent component, String value)
    {
        //if (StringUtils.isEmpty(value)){ return null;}
        if (StringUtils.isEmpty(value)){ return number;}

        String newValue=StringUtils.remove(value,".").replace(',', '.');
   
        try{
          number = new BigDecimal(newValue.trim());
        }
        catch(Exception e )
        {
            number=BigDecimal.ZERO;
           
        }
       
        return number;
    }   
   
     public String getAsString(FacesContext context, UIComponent component, Object value) {
           
         NumberFormat n = NumberFormat.getCurrencyInstance(Locale.ITALY);
         if(!StringUtils.isEmpty((value.toString())))
         {
               /*  double dValue =new BigDecimal(value.toString()).doubleValue();
                 String newValue = n.format(dValue);*/
                
                 String newValue = n.format(value);
                 newValue= StringUtils.remove(newValue,"\u20AC");
                 return StringUtils.remove(newValue,' ');
         }
         else
         {
                 return "0,00";
         }
        
}

    public String toString()
    {

        return "0,00";
    }
}