Spring的DataBinder如何用于转换普通参数值?

时间:2015-10-13 12:44:06

标签: java spring data-binding

我在回答code时一直在挖掘Spring DataBinder docsthis question,我注意到DataBinder constructor docs提到:

  

target - 要绑定到的目标对象(如果绑定器只是,则为null)   用于转换普通参数值)

我一直在寻找并且没有找到这样的用法,这真的让我很好奇。非常感谢有关的任何见解:

  • 如何将这样的数据绑定器与空目标一起使用以转换普通参数值?
  • 或者在此上下文中转换普通参数值实际上意味着什么?
  • 它是否也适用于Spring MVC? (因为我注意到它也在WebDataBinder的构造函数文档中提到过。)

3 个答案:

答案 0 :(得分:1)

您可以将DataBinder视为过滤器或处理程序,所有请求参数在消耗之前都会彻底完成。要使用DataBinder功能,您需要在控制器类中使用" @InitBinder "注解。例如:

 @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
        dateFormat.setLenient(false);

        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
        // bind empty strings as null
        binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
    }

如您所见,您在该方法中需要做的就是为特定数据类型注册 CustomEditor

答案 1 :(得分:1)

我已经在Spring Framework源代码中进行了一些挖掘,正如您所描述的那样使用null参数搜索用法。由于我也没有意识到这种用法,所以我可以通过查看测试用例来更好地了解事情。

DataBinder的测试类(毫不奇怪)DataBinderTests

我将在这里粘贴一个用法示例,以及我找到代码的github链接,以供参考:

对于你的第一个问题,答案似乎是你使用带有DataBinder构造函数参数的null,这意味着你只想使用转换工具,而没有数据绑定机制(因为我们有没有传递一个对象来绑定值)。 这个非常简洁的测试用例显示了这种用法,使用DataBinder创建null,将DefaultFormattingConversionService设置为dataBinder并在此之后注册自定义编辑器。 如果在转换bean之后需要不同的String表示,可以使用addConverter方法添加自定义转换器。

    @Test
    public void testConversionWithInappropriateStringEditor() {
        DataBinder dataBinder = new DataBinder(null);
        DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
        dataBinder.setConversionService(conversionService);
        dataBinder.registerCustomEditor(String.class, new StringTrimmerEditor(true));

        NameBean bean = new NameBean("Fred");
        assertEquals("ConversionService should have invoked toString()", "Fred", dataBinder.convertIfNecessary(bean, String.class));
        conversionService.addConverter(new NameBeanConverter());
        assertEquals("Type converter should have been used", "[Fred]", dataBinder.convertIfNecessary(bean, String.class));
    }

供参考,以下是NameBeanConverter的代码(也来自测试类)

public static class NameBeanConverter implements Converter<NameBean, String> {
    @Override
    public String convert(NameBean source) {
        return "[" + source.getName() + "]";
    }
}

来源:https://github.com/spring-projects/spring-framework/blob/d5ee787e1e6653257720afe31ee3f8819cd4605c/spring-context/src/test/java/org/springframework/validation/DataBinderTests.java#L598-L609

我认为上述解释是前两个问题的答案:

  

如何将这样的数据绑定器与空目标一起使用来转换普通参数值?
  或者在此上下文中转换普通参数值实际意味着什么?

对于您的第三个问题,遗憾的是,我没有找到任何可用的测试用例,但是通过WebDataBinder的代码让我想到与DataBinder相比没有“附加价值”就null构造函数参数而言,您也可以通过WebDataBinder使用转换工具。

你可能知道你可以将你的web请求字段绑定到你的支持bean,添加转换(例如将特别格式化的日期转换为支持bean上的实际Date字段对象)等,但我不知道我想更详细地描述这一点,因为我猜这个问题不是你的观点。

最后,我发现这篇文章对如何使用WebDataBinder非常有用:http://www.intertech.com/Blog/spring-frameworks-webdatabinder/

答案 2 :(得分:0)

在Spring MVC中,具有空目标的DataBinder会自动用于以下情况:

@RequestMapping(method = RequestMethod.GET)
public String showHome(@RequestParam("date") Date date) {

    return "home";
}

在这种情况下,创建的DataBinder有一个objectName&#34; date&#34;和一个空目标。