Estou procurando a maneira mais fácil e simples de vincular e converter dados no Spring MVC. Se possível, sem fazer nenhuma configuração xml.
Até agora eu tenho usado PropertyEditors assim:
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());
}
...
}
É simples: ambas as conversões são definidas na mesma classe e a ligação é direta. Se eu quisesse fazer uma ligação geral em todos os meus controladores, ainda podia adicionar 3 linhas na minha configuração xml .
Mas o Spring 3.x introduziu uma nova maneira de fazer isso, usando os Conversores :
Dentro de um contêiner Spring, esse sistema pode ser usado como uma alternativa aos PropertyEditors
Então, digamos que eu queira usar conversores, porque é "a última alternativa". Eu teria que criar dois conversores:
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();
}
}
Primeira desvantagem: eu tenho que fazer duas aulas. Benefício: não há necessidade de lançar graças à genéricos.
Então, como eu simplesmente vinculo os dados aos conversores?
Segunda desvantagem: não encontrei nenhuma maneira simples (anotações ou outras facilidades programáticas) de fazer isso em um controlador: nada parecido someSpringObject.registerCustomConverter(...);
.
As únicas maneiras que eu encontrei seriam tediosas, não simples e apenas sobre a ligação geral entre controladores:
-
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="somepackage.StringToCategory"/> <bean class="somepackage.CategoryToString"/> </set> </property> </bean>
Configuração Java ( apenas no Spring 3.1+ ):
@EnableWebMvc @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override protected void addFormatters(FormatterRegistry registry) { registry.addConverter(new StringToCategory()); registry.addConverter(new CategoryToString()); } }
Com todas essas desvantagens, por que usar conversores? Estou esquecendo de algo ? Existem outros truques que eu não conheço?
Estou tentado a continuar usando PropertyEditors ... A ligação é muito mais fácil e rápida.