Je recherche le moyen le plus simple et le plus simple de lier et de convertir des données dans Spring MVC. Si possible, sans faire de configuration xml.
Jusqu'à présent, j'utilise PropertyEditors comme ceci:
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());
}
...
}
C'est simple: les deux conversions sont définies dans la même classe et la liaison est simple. Si je voulais faire une liaison générale sur tous mes contrôleurs, je pourrais toujours ajouter 3 lignes dans ma configuration xml .
Mais Spring 3.x a introduit une nouvelle façon de le faire, en utilisant des convertisseurs :
Dans un conteneur Spring, ce système peut être utilisé comme alternative aux PropertyEditors
Alors disons que je veux utiliser des convertisseurs parce que c'est "la dernière alternative". Il faudrait que je crée 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 cours. Avantage: pas besoin de lancer grâce à la généricité.
Alors, comment puis-je simplement lier les données aux convertisseurs?
Deuxième inconvénient: je n'ai trouvé aucun moyen simple (annotations ou autres facilités de programmation) de le faire dans un contrôleur: rien de telsomeSpringObject.registerCustomConverter(...);
.
Les seuls moyens que j'ai trouvés seraient fastidieux, pas simples et ne concerneraient que la liaison générale entre contrôleurs:
-
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="somepackage.StringToCategory"/> <bean class="somepackage.CategoryToString"/> </set> </property> </bean>
Configuration Java ( uniquement dans Spring 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? Est-ce que je manque quelque chose? Y a-t-il d'autres astuces dont je ne suis pas au courant?
Je suis tenté de continuer à utiliser PropertyEditors ... La liaison est beaucoup plus simple et rapide.