- @InitBinder用于在@Controller中标注于方法,表示为当前控制器注册一个属性编辑器,只对当前的Controller有效,通常用于完成由表单字段到 JavaBean 属性的类型转换和绑定
参数 |
描述 |
value |
此 init-binder 方法应该应用于的命令/表单属性和/或请求参数的名称。 |
- 由 @InitBinder 标识的方法,可以对 WebDataBinder 对象进行初始化。WebDataBinder 是 DataBinder 的子类,是用来绑定请求参数到指定的属性编辑器
- WebDataBinder有以下方法:
方法 |
说明 |
setFieldMarkerPrefix() |
指定一个前缀,该前缀可用于指示默认值字段的参数,名称为“prefix+field”。未提供字段时,将使用默认字段的值 |
setFieldDefaultPrefix() |
指定一个前缀,该前缀可用于指示默认值字段的参数,名称为“prefix+field”。未提供字段时,将使用默认字段的值。 |
setBindEmptyMultipartFiles() |
设置是否绑定空的MultipartFile参数。默认值为“true” |
setAutoGrowNestedPaths() |
设置此绑定器是否应尝试“自动增长”包含空值的嵌套路径。默认值为“true” 如果为“true”,则将使用默认对象值填充空路径位置,并遍历该位置,而不是导致异常。当访问越界索引时,此标志还支持集合元素的自动增长 |
setAutoGrowCollectionLimit() |
指定数组和集合自动增长的限制 默认值为256,防止在索引较大时出现OutOfMemoryErrors。如果您的自动增长需求异常高,请提高此限制 |
setIgnoreUnknownFields() |
设置是否忽略未知字段,即是否忽略目标对象中没有相应字段的绑定参数。 默认值为“true”。禁用此选项可强制所有绑定参数在目标对象中必须具有匹 |
setIgnoreInvalidFields() |
设置是否忽略无效字段,即是否忽略目标对象中具有不可访问的对应字段的绑定参数(例如,由于嵌套路径中的空值) 默认值为“false”。启用此选项可忽略目标对象图形中不存在部分中嵌套对象的绑定参数 |
setAllowedFields() |
注册应允许绑定的字段。默认值为“所有字段”。限制这一点,例如,在绑定HTTP请求参数时,避免恶意用户进行不必要的修改 支持“xxx*”、“*xxx”和“*xxx*”模式。更复杂的匹配可以通过重写isAllowed方法来实现 |
setDisallowedFields() |
注册不允许绑定的字段。默认值为“无”。将字段标记为不允许,例如,在绑定HTTP请求参数时避免恶意用户进行不必要的修改。 支持“xxx*”、“*xxx”和“*xxx*”模式。更复杂的匹配可以通过重写isAllowed方法来实现 |
setRequiredFields() |
注册每个绑定过程所需的字段。 如果传入属性值列表中不包含指定字段之一,则将创建相应的“缺少字段”错误,错误代码为“必需”(由默认绑定错误处理器) |
setMessageCodesResolver() |
设置用于将错误解析为消息代码的策略。将给定策略应用于基础错误持有者 |
setBindingErrorProcessor() |
设置用于处理绑定错误的策略,即必填字段错误和PropertyAccessException |
setValidator() |
将验证器设置为在每个绑定步骤后应用 |
setConversionService() |
指定用于转换属性值的Spring3.0ConversionService,作为JavaBeans PropertyEditor的替代方案 |
validate() |
调用指定的验证器(如果有)。 |
addCustomFormatter() |
添加自定义格式化程序,将其应用于与格式化程序声明类型匹配的所有字段。 |
addValidators() |
在每个绑定步骤后添加要应用的验证器 |
replaceValidators() |
在每个绑定步骤之后,替换要应用的验证器。 |
registerCustomEditor() |
注册相应的PropertyEditor适配器 |
bind() |
将给定的属性值绑定到此绑定器的目标。 此调用可能会创建字段错误,表示基本绑定错误,如必填字段(代码“required”),或值和bean属性之间的类型不匹配(代码“TypeMitch”) |
isBindEmptyMultipartFiles() |
返回是否绑定空的MultipartFile参数。 |
isAutoGrowNestedPaths() |
返回嵌套路径的“自动增长”是否已激活。 |
isIgnoreUnknownFields() |
返回绑定时是否忽略未知字段 |
isIgnoreInvalidFields() |
返回绑定时是否忽略无效字段 |
initBeanPropertyAccess() |
初始化此DataBinder的标准JavaBean属性访问。 这是默认值;显式调用只会导致急切的初始化 |
initDirectFieldAccess() |
初始化此DataBinder的直接字段访问,作为默认bean属性访问的替代方法 |
getTarget() |
返回包装的目标对象 |
getObjectName() |
返回绑定对象的名称 |
getAllowedFields() |
返回应允许绑定的字段 |
getRequiredFields() |
返回每个绑定过程所需的字段 |
getFieldMarkerPrefix() |
返回标记可能为空字段的参数的前缀 |
getFieldDefaultPrefix() |
返回标记默认字段的参数的前缀 |
getEmptyValue() |
确定指定字段的空值 如果字段类型已知,则默认实现将委托给getEmptyValue(类),否则返回null |
getAutoGrowCollectionLimit() |
返回数组和集合自动增长的当前限制 |
getBindingResult() |
返回此DataBinder创建的BindingResult实例。这允许在绑定操作后方便地访问绑定结果 |
getDisallowedFields() |
返回不允许绑定的字段 |
getBindingErrorProcessor() |
返回处理绑定错误的策略 |
getValidator() |
在每个绑定步骤(如果有的话)之后,重新启动主验证器以应用 |
getValidators() |
在每个绑定步骤后返回要应用的主验证器(如果有)。 |
getConversionService() |
返回关联的ConversionService(如果有) |
close() |
关闭此DataBinder,如果遇到任何错误,可能会引发BindException。 |
- 由于前台传到controller里的值是String类型的,当往Model添加这个值的时候,如果属性是个对象,Spring通过定义的编辑器预先进行转换,在转交给controller的方法处理
注
- @InitBinder注解的方法不能有返回值,它必须声明为void
- @InitBinder注解的方法的参数通常是是 WebDataBinder
- @InitBinder注解对post的json没有效果
注册编辑器
- Spring mvc中默认为WebDataBinder提供了默认的编辑器,用于基本的参数类型转化
使用默认的编辑器
- Spring mvc有以下默认编辑器:
示例
@InitBinder public void initBinder(WebDataBinder binder){ binder.registerCustomEditor(String.class, new StringTrimmerEditor(true)); } |
使用自定义编辑器
- 使用自定义的编辑器类需要继承PropertiesEditor类
示例
- DoubleEditor.java
public class DoubleEditor extends PropertyEditorSupport { @Override public void setAsText(String text) throws IllegalArgumentException { if (text == null || text.equals("")) { text = "0"; } setValue(Double.parseDouble(text)); }
@Override public String getAsText() { return getValue().toString(); } } |
- MyController.java
@InitBinder protected void initBinder(WebDataBinder binder){
binder.registerCustomEditor(Double.class, new DoubleEditor()); } |
类型转换
- 通过使用WebDataBinder参数可以获取前端传递的参数对象,可以对其进行类型转换
示例
@InitBinder public void initBinder(WebDataBinder binder){ //将WebDataBinder数据转换为格式化的日期格式 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); dateFormat.setLenient(false); binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true)); } |
参数绑定
- @InitBinder中的参数可以对注解了@ModelAttribute的参数进行绑定
- @InitBinder注解的方法中在WebDataBinder对象可以对参数对象进行封装处理,例如添加前后缀等
示例
//给接口中的变量取别名
@PostMapping("/book")
public void addBook(@ModelAttribute("b")Book book, @ModelAttribute("a")Author author){
System.out.println(book);
System.out.println(author);
}
//在 @ControllerAdvice 标记的类中添加@InitBinder
@InitBinder("b")
public void b(WebDataBinder binder){
binder.setFieldDefaultPrefix("b."); //绑定前缀
}
@InitBinder("a")
public void a(WebDataBinder binder){
binder.setFieldDefaultPrefix("a."); //绑定前缀
}
- shop.jsp
<form action="/buy" method="post">
name: <input type="text" name="a.name"> <br>
age: <input type="text" name="a.age"> <br>
name: <input type="text" name="b.name"> <br>
age: <input type="text" name="b.price"> <br>
<input type="submit">
</form>
- @InitBinder("b") 注解表示该方法用来处理和Book和相关的参数,在方法中,给参数添加一个 b 前缀,即请求参数要有b前缀.
- 请求发送时,通过给不同对象的参数添加不同的前缀,可以实现参数的区分.