lundi 20 mai 2013

Modifier le rendu d'une balise XML avec XStream en utilisant un converter

Toujours en utilisant le même exemple, la classe Toto contient une date dont le rendu est le suivant :
<date__Envoie>2013-02-28 17:01:29.669 UTC</date__Envoie>

Afin de personnaliser l'affichage de la date, il est possible via une annotation d'indiquer a XStream de ne pas utiliser le rendu standard mais un rendu personnalisé.
Il est donc nécessaire d'ajouter l'annotation suivant au champ dateEnvoie (en-dessous de l'annotation alias) :
@XStreamConverter(value=MyDateConverter.class)

Dans le cas d'une date (mais aussi pour une String, Integer...), il s'agit de remplacer le comportement de la classe com.thoughtworks.xstream.converters.basic.DateConverter.
Cette classe hérite de la classe com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter.
Il est simplement nécessaire de redéfinir les méthodes :
public class MyDateConverter extends AbstractSingleValueConverter {
    // Indique si cette classe prend en charge la conversion
    @Override
    public boolean canConvert(Class type) {
        return type.equals(java.util.Date.class);
    }

    // Transforme la valeur XML en Java
    @Override
    public Object fromString(String str) {
        final SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd") ;
        
        Date dateStr = null ; 
            
        try {
            dateStr = sdf.parse(str) ;
        } catch (ParseException e) {
            // Nothing
        }
         
        return dateStr ;
    }
    
    // Transforme la valeur Java en XML
    @Override
    public String toString(Object obj) {
        final Date date = (Date)obj;
        
        final SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd") ;
        
        return sdf.format(date) ;
    }
}

Aucun commentaire:

Enregistrer un commentaire