Szukam najłatwiejszego i najprostszego sposobu na powiązanie i konwersję danych w Spring MVC. Jeśli to możliwe, bez wykonywania jakiejkolwiek konfiguracji XML.
Do tej pory korzystałem z PropertyEditors w następujący sposób:
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();
}
}
i
...
public class MyController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Category.class, new CategoryEditor());
}
...
}
To proste: obie konwersje są zdefiniowane w tej samej klasie, a powiązanie jest proste. Gdybym chciał wykonać ogólne powiązanie na wszystkich moich kontrolerach, nadal mógłbym dodać 3 wiersze w mojej konfiguracji xml .
Ale Spring 3.x wprowadził nowy sposób, aby to zrobić, używając konwerterów :
W kontenerze Spring ten system może być używany jako alternatywa dla PropertyEditors
Powiedzmy, że chcę używać konwerterów, ponieważ jest to „najnowsza alternatywa”. Musiałbym stworzyć dwa konwertery:
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();
}
}
Pierwsza wada: muszę zrobić dwie klasy. Zaleta: nie ma potrzeby rzucania dzięki hojności.
Jak więc po prostu powiązać konwertery z danymi?
Druga wada: nie znalazłem prostego sposobu (adnotacje lub inne funkcje programistyczne), aby to zrobić w kontrolerze: nic podobnego someSpringObject.registerCustomConverter(...);
.
Jedyne sposoby, które znalazłem, byłyby żmudne, nie proste i dotyczyłyby tylko ogólnego powiązania między kontrolerami:
-
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="somepackage.StringToCategory"/> <bean class="somepackage.CategoryToString"/> </set> </property> </bean>
Konfiguracja Java ( tylko w Spring 3.1+ ):
@EnableWebMvc @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override protected void addFormatters(FormatterRegistry registry) { registry.addConverter(new StringToCategory()); registry.addConverter(new CategoryToString()); } }
Biorąc pod uwagę wszystkie te wady, po co używać konwerterów? Czy coś mi brakuje? Czy są inne sztuczki, których nie jestem świadomy?
Kusi mnie, aby dalej używać PropertyEditors ... Wiązanie jest znacznie łatwiejsze i szybsze.