Je suis à la recherche de la méthode la plus simple et la plus simple façon de lier et de convertir des données dans Spring MVC. Si possible, sans faire aucune configuration xml.
Jusqu'à présent, j'ai été en utilisant PropertyEditors comme suit :
public class CategoryEditor extends PropertyEditorSupport {
// Converts a String to a Category (when submitting form)
@Override
public void setAsText(String text) {
Category c = new Category(text);
this.setValue(c);
}
// Converts a Category to a String (when displaying form)
@Override
public String getAsText() {
Category c = (Category) this.getValue();
return c.getName();
}
}
et
...
public class MyController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Category.class, new CategoryEditor());
}
...
}
Il en est simple : la conversion sont définis dans la même classe, et la liaison est simple. Si je voulais faire une liaison générale dans tous mes contrôleurs, je pourrais encore ajouter les 3 lignes dans mon xml de config.
Mais Le Printemps 3.x introduit une nouvelle façon de faire, à l'aide de Convertisseurs :
Au sein d'un Printemps conteneur, ce système peut être utilisé comme une alternative pour PropertyEditors
Donc, disons que je veux utiliser les Convertisseurs parce que c'est "la dernière alternative". Je dois créer deux convertisseurs :
public class StringToCategory implements Converter<String, Category> {
@Override
public Category convert(String source) {
Category c = new Category(source);
return c;
}
}
public class CategoryToString implements Converter<Category, String> {
@Override
public String convert(Category source) {
return source.getName();
}
}
Premier inconvénient : je dois faire deux classes. Avantage : pas besoin de cast grâce à genericity.
Alors, comment puis-je simplement lier des données les convertisseurs ?
Deuxième inconvénient : je n'ai pas trouvé de moyen simple (annotations ou d'autres programmes installations) de le faire dans un contrôleur : rien de tel someSpringObject.registerCustomConverter(...);
.
Les seuls moyens que j'ai trouvé serait fastidieux, pas simple, et seulement environ général de la croix-contrôleur de liaison :
-
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <list> <bean class="somepackage.StringToCategory"/> <bean class="somepackage.CategoryToString"/> </list> </property> </bean>
-
Java config (seulement au Printemps 3.1+) :
@EnableWebMvc @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override protected void addFormatters(FormatterRegistry registry) { registry.addConverter(new StringToCategory()); registry.addConverter(new CategoryToString()); } }
Avec tous ces inconvénients, pourquoi utiliser des Convertisseurs ? Ai-je raté quelque chose ? Il existe d'autres astuces que je ne suis pas au courant ?
Je suis tenté d'aller sur l'aide de PropertyEditors... Liaison est beaucoup plus facile et plus rapide.