Formatters

Transformer les Strings en Objets Java

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com

Property editor et conversion service ne sont pas les seuls outils mis à disposition par Spring pour formater les valeurs. Un troisième élément, Spring formatters, permet également de transformer une donnée au format souhaité à son affichage.

Qu'est-ce que c'est un Formatter dans Spring ?

Formatter est une alternative à des property editor. Il sera donc utilisé dans chaque conversion d'un String en un objet donné. Un formatter servira à transformer la chaîne de caractères reçue depuis notre interface web en l'instance d'une classe souhaitée.

La SPI de formatter est fortement typé. Cela veut dire que les types de données employés doivent décrire les données manipulées. Cette interface se présente ainsi :

public interface Formatter<T> extends Printer<T>, Parser<T> { }

public interface Printer<T> {
    String print(T fieldValue, Locale locale);
}

public interface Parser<T> {
    T parse(String clientValue, Locale locale) throws ParseException;
}

On constate que notre implémentation de cette interface devra implémenter deux méthodes :
- print() : afficher la représentation d'un objet sous forme d'une chaîne de caractères
- parse() : transforme la chaîne de caractères en l'instance de l'objet souhaité

Les formatteurs peuvent être associés à des attributs grâce à des annotations. Spring fournit quelques formatteurs par défaut :
- NumberFormatter : annoté avec @NumberFormat, il permet de formatter les chiffres. Il est applicable pour toutes les classes qui héritent de java.lang.Number. L'annotation peut prendre des paramètres suivants : style (Style.CURRENCY, Style.NUMBER, Style.PERCENT...) ou pattern (par exemple #,###.### qui indique l'affichage des chiffres séparés par des virgules et des points).
- DateFormatter : annoté avec @DateTimeFormat, il permet de représenter une date selon le format spécifié dans le paramètre pattern.
- CurrencyFormatter : permet d'éditer les attributs représentant des montants en fonction de la Locale
- PercentFormatter : ressemble à CurrencyFormatter, mais gère les valeurs exprimées en pourcentage

Utiliser formatters par défaut du Spring

Actuellement notre application utilise les formatters définis dans Spring par défaut. Dans beaucoup d'endroits on retrouve l'annotation @DateTimeFormat. Pour le constater, voici le fragment de l'entité Subscriber :

public class Subscriber extends ParentEntity implements Serializable {
    @Temporal(TIMESTAMP)
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    @Column(name = "created_su")
    public Date getCreated() {
        return created;
    }
    // ...
}

En occurrence, la valeur du champ created< sera affichée sous format "année-mois-jour heure:minutes:secondes".

Implémenter des formatters personnalisés dans Spring Dans notre application on utilisera un formatter pour affichage des méthodes de paiement sur la page de suscription à l'abonnement. Tout d'abord on présentera le fragment du fichier de formulaire et de la validation :

afficher le code

Le fichier de vue va lister les méthodes de paiement de la manière suivante :

    <form:radiobuttons  path="modeChecked" items="${subscribeForm.modes}" itemLabel="name" itemValue="id" />

Maintenant on peut passer à la partie d'enregistrement du formatteur. La première étape consiste à le définir dans la liste des formatters dans notre bean conversionService :

    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
	<... CONVERTERS HERE ...>
        <property name="formatters">
            <set>
                <bean class="library.formatter.PaymentMethodFormatter" />
            </set>
        </property>
    </bean>

Maintenant quand tout est configuré, on peut passer à la cerise sur le gâteau, notre formateur :

afficher le code

La méthode print() a pour but de déterminer ce qui sera affiché dans l'attribut value du formulaire. Cette valeur sera ensuite passée à la méthode parse() qui va s'occuper de retourner une instance PaymentMethod. La validateur et le contrôleur pourront alors manipuler cette instance pour vérifier la conformité des données envoyées par le formulaire.

Une question ? Une remarque ?

*

*

Un conseil Symfony1

Comment afficher tous les paramètres d'une requête ?

Pour afficher tous les paramètres d'une requête, il suffit d'appeler la méthode getParameterHolder()->getAll() .