我正在寻找在 Spring MVC 中绑定和转换数据的最简单的方法。如果可能的话,不做任何xml配置。
到目前为止我一直在使用属性编辑器像这样:
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();
}
}
and
...
public class MyController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(Category.class, new CategoryEditor());
}
...
}
这很简单:两个转换都在同一个类中定义,并且绑定很简单。如果我想在所有控制器之间进行通用绑定,我仍然可以添加我的 xml 配置中有 3 行.
但是 Spring 3.x 引入了一种新的方法来做到这一点,使用转换器 :
在 Spring 容器内,该系统可以用作替代方案
至 PropertyEditors
假设我想使用转换器,因为它是“最新的替代方案”。我必须创建two转换器:
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配置 (仅在 Spring 3.1+ 中) :
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
protected void addFormatters(FormatterRegistry registry) {
registry.addConverter(new StringToCategory());
registry.addConverter(new CategoryToString());
}
}
既然有这些缺点,为什么还要使用转换器呢?我错过了什么吗?还有其他我不知道的技巧吗?
我很想继续使用 PropertyEditors...绑定更加容易和快捷。