我正在寻找在 SpringMVC 中绑定和转换数据的最简单和最容易的方法。如果可能,不执行任何 xml 配置。
到目前为止,我一直是这样使用 Property 编辑器的:
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();
}
}
还有
...
public class MyController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Category.class, new CategoryEditor());
}
...
}
它很简单: 两个转换都在同一个类中定义,而且绑定很简单。如果要在所有控制器上执行通用绑定,仍然可以添加 Xml 配置中的3行。
但 Spring 3.x 引入了一种新的方法,使用 转换器:
在 Spring 容器中,可以使用此系统作为替代方案 到 PropertyEditor
因此,让我们说,我想使用转换器,因为它是“最新的替代品”。我将不得不创建 二转换器:
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();
}
}
第一个缺点: 我必须做两个类。好处: 不需要投感谢慷慨。
那么,如何简单地对转换器进行数据绑定呢?
第二个缺点: 我还没有找到任何简单的方法(注释或其他编程工具)来在控制器中实现它: 完全不像 someSpringObject.registerCustomConverter(...);
。
我找到的唯一方法是单调乏味的,并不简单,而且只涉及一般的交叉控制器绑定:
XML 配置 :
<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 config (only 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());
}
}
With all these drawbacks, why using Converters ? Am I missing something ? Are there other tricks that I am not aware of ?
I am tempted to go on using PropertyEditors... Binding is much easier and quicker.