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

我在回答这个问题时一直在挖掘Spring DataBinder 代码和文档 ,我注意到DataBinder构造函数文档提到:

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

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

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

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

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

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

对于你的第一个问题,答案似乎是你使用带有null构造函数参数的DataBinder ,这意味着你只想使用转换工具,而没有数据绑定机制(因为我们还没有传递一个对象来绑定值)。 这个非常简洁的测试用例显示了这种用法,创建了一个带有nullDataBinder ,将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 { @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/

您可以将DataBinder视为filter或处理程序,所有请求参数在消耗之前都会彻底完成。 要使用DataBinderfunction,您需要使用“ @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

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

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

在这种情况下,创建的DataBinder具有objectName“date”和null目标。