【发布时间】:2012-09-14 16:47:31
【问题描述】:
我正在寻找在 Spring MVC 中绑定和转换数据的最简单和最简单的方法。如果可能,不做任何 xml 配置。
到目前为止,我一直像这样使用PropertyEditors:
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());
}
...
}
很简单:两个转换都定义在同一个类中,绑定很简单。如果我想对所有控制器进行通用绑定,我仍然可以添加 3 lines in my xml config。
但是 Spring 3.x 引入了一种新方法,使用 Converters :
在 Spring 容器中,此系统可用作替代方案 到 PropertyEditors
假设我想使用 Converters,因为它是“最新的替代品”。我必须创建 两个 转换器:
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(...); 这样的。
我发现的唯一方法是乏味的,并不简单,而且只涉及一般的跨控制器绑定:
-
<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(仅适用于 Spring 3.1+):
@EnableWebMvc @Configuration public class WebConfig extends WebMvcConfigurerAdapter { @Override protected void addFormatters(FormatterRegistry registry) { registry.addConverter(new StringToCategory()); registry.addConverter(new CategoryToString()); } }
鉴于所有这些缺点,为什么要使用 Converters ?我错过了什么吗?还有其他我不知道的技巧吗?
我很想继续使用 PropertyEditors...绑定更简单快捷。
【问题讨论】:
-
注意(我也磕磕绊绊,使用Spring 3.2.17):使用
时需要实际引用这个conversionService bean: -
addFormatters(...) 必须是公开的。此外,由于 5.0 WebMvcConfigurerAdapter 已被弃用。
-
如果在 Spring 3 中寻找更新的替代方案。您可以查看 Spring Field Formatters (Replacement for PropertyEditor) docs.spring.io/spring-framework/docs/current/reference/html/…
标签: java spring data-binding spring-mvc type-conversion