Sto cercando il modo più semplice e semplice per associare e convertire i dati in Spring MVC. Se possibile, senza eseguire alcuna configurazione XML.
Finora ho usato PropertyEditor in questo modo:
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();
}
}
e
...
public class MyController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Category.class, new CategoryEditor());
}
...
}
È semplice: entrambe le conversioni sono definite nella stessa classe e l'associazione è semplice. Se volessi fare un binding generale su tutti i miei controller, potrei ancora aggiungere 3 righe nella mia configurazione XML .
Ma Spring 3.x ha introdotto un nuovo modo di farlo, usando Convertitori :
All'interno di un contenitore Spring, questo sistema può essere utilizzato in alternativa a PropertyEditor
Quindi diciamo che voglio usare i convertitori perché è "l'ultima alternativa". Dovrei creare due convertitori:
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();
}
}
Primo inconveniente: devo fare due lezioni. Vantaggio: non è necessario lanciare grazie alla genericità.
Quindi, come posso semplicemente associare i dati ai convertitori?
Secondo svantaggio: non ho trovato alcun modo semplice (annotazioni o altre strutture programmatiche) per farlo in un controller: niente di simile someSpringObject.registerCustomConverter(...);
.
L'unico modo che ho trovato sarebbe noioso, non semplice, e solo sull'associazione cross-controller generale:
-
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="somepackage.StringToCategory"/> <bean class="somepackage.CategoryToString"/> </set> </property> </bean>
Config Java ( solo 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()); } }
Con tutti questi inconvenienti, perché usare i convertitori? Mi sto perdendo qualcosa ? Ci sono altri trucchi di cui non sono a conoscenza?
Sono tentato di continuare a utilizzare PropertyEditor ... Il binding è molto più semplice e rapido.