Spring中DataBinder与ConversionService的区别

时间:2012-02-07 09:47:50

标签: java spring validation bean-validation databinder

对于将Web请求绑定到模型对象,我在使用Spring的DataBinder和ConversionService的使用和目的时遇到了一些困惑。出现这种情况是因为我最近尝试通过添加来使用JSR-303验证。

在此之前我使用过:

<bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="webBindingInitializer">
        <bean class="mypackage.GlobalWebBindingInitializer" />
    </property>
</bean>

这很好,因为我想要一个可供多个控制器使用的全局DataBinder。 在GlobalWebBindingInitialzer类中实现以下几个:

binder.registerCustomEditor(MyClass.class, new PropertyEditorSupport(MyClass.class)

但是我想使用@Valid注释添加。这样做的副作用是上面的AnnotationMethodHandlerAdapter bean已经被定义为注释驱动的一部分,所以我的全局数据绑定器被忽略了。

所以现在我创建了这个类:

public class MyClassConverter implements Converter<String, MyClass>

我很困惑。如果我想使用,我应该使用转换服务而不是数据仓吗?

2 个答案:

答案 0 :(得分:3)

历史上,Spring的数据绑定用于将数据转换为javabeans。它严重依赖JavaBean PropertyEditors进行转换。

Spring 3.0 added new and different support用于转化和格式化。一些更改包括“core.convert”包和“格式”包,根据文档“可以用作PropertyEditors的更简单的替代品。”

现在,回答你的问题,是的,看起来你走在了正确的轨道上。您可以继续使用其中任何一种,但在很多情况下,您应该能够使用转换器而不是数据绑定器。

有关如何添加验证is available online的文档。

答案 1 :(得分:2)

进一步回答上面的PropertyEditors(esp PropertyEditorSupport)不是线程安全的,这在Web环境中尤其需要,其中每个请求都在一个单独的线程中提供。从理论上讲,PropertyEditors应该在高度并发的条件下产生不可预测的结果。

但不确定为什么Spring首先使用了PropertyEditors。可能是因为它适用于SpringMVC之前的非多线程环境和日期?

编辑:

虽然,PropertyEditorSupport看起来并不是线程安全Spring确保以线程安全的方式使用它。例如,每次需要数据绑定时都会调用initBinder()。我错误地认为,当控制器初始化时,它只调用一次。

@InitBinder
public void initBinder(WebDataBinder binder) {

    logger.info("initBinder() called.");

    DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm");
    dateFormat.setLenient(false);

    binder.registerCustomEditor(Date.class, new CustomDateEditor(
            dateFormat, false));
}

这里的日志“initBinder()调用。”每当绑定发生时都会出现多次。