6

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

在此之前,我使用:

<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>

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

4

2 回答 2

3

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

Spring 3.0为转换和格式化添加了新的和不同的支持。一些更改包括“core.convert”包和“格式”包,根据文档“可以用作 PropertyEditors 的更简单替代品”。

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

有关如何添加验证的文档可在线获取

于 2012-02-07T16:24:15.757 回答
2

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

但不确定为什么 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()”。绑定发生时可以多次显示。

于 2012-07-29T10:41:33.973 回答