我在回答code时一直在挖掘Spring DataBinder docs和this question,我注意到DataBinder constructor docs提到:
target - 要绑定到的目标对象(如果绑定器只是,则为null) 用于转换普通参数值)
我一直在寻找并且没有找到这样的用法,这真的让我很好奇。非常感谢有关的任何见解:
答案 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() + "]";
}
}
我认为上述解释是前两个问题的答案:
如何将这样的数据绑定器与空目标一起使用来转换普通参数值?
或者在此上下文中转换普通参数值实际意味着什么?
对于您的第三个问题,遗憾的是,我没有找到任何可用的测试用例,但是通过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;和一个空目标。