Ich suche nach der einfachsten und einfachsten Möglichkeit, Daten in Spring MVC zu binden und zu konvertieren. Wenn möglich, ohne eine XML-Konfiguration vorzunehmen.
Bisher habe ich PropertyEditors wie folgt verwendet:
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();
}
}
und
...
public class MyController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Category.class, new CategoryEditor());
}
...
}
Es ist einfach: Beide Konvertierungen werden in derselben Klasse definiert, und die Bindung ist unkompliziert. Wenn ich eine allgemeine Bindung für alle meine Controller durchführen wollte, konnte ich meiner XML-Konfiguration immer noch 3 Zeilen hinzufügen .
Mit Spring 3.x wurde jedoch mithilfe von Konvertern eine neue Methode eingeführt :
Innerhalb eines Spring-Containers kann dieses System als Alternative zu PropertyEditors verwendet werden
Nehmen wir also an, ich möchte Konverter verwenden, weil dies "die neueste Alternative" ist. Ich müsste zwei Konverter erstellen :
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();
}
}
Erster Nachteil: Ich muss zwei Klassen machen. Vorteil: Dank der Großzügigkeit muss nicht gegossen werden.
Wie binde ich dann einfach Daten an die Konverter?
Zweiter Nachteil: Ich habe keine einfache Möglichkeit (Anmerkungen oder andere programmatische Funktionen) gefunden, dies in einer Steuerung zu tun: nichts Vergleichbares someSpringObject.registerCustomConverter(...);
.
Die einzigen Möglichkeiten, die ich gefunden habe, wären mühsam, nicht einfach und nur in Bezug auf die allgemeine Cross-Controller-Bindung:
-
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="somepackage.StringToCategory"/> <bean class="somepackage.CategoryToString"/> </set> </property> </bean>
Java-Konfiguration ( nur in Spring 3.1+ ):
@EnableWebMvc @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override protected void addFormatters(FormatterRegistry registry) { registry.addConverter(new StringToCategory()); registry.addConverter(new CategoryToString()); } }
Warum sollten Sie bei all diesen Nachteilen Konverter verwenden? Vermisse ich etwas Gibt es andere Tricks, die mir nicht bekannt sind?
Ich bin versucht, PropertyEditors weiter zu verwenden ... Die Bindung ist viel einfacher und schneller.