数据绑定(@InitBinder)

Exisi 2022-06-28 14:28:53
Categories: Tags:

 

参数

描述

value

init-binder 方法应该应用于的命令/表单属性和/或请求参数的名称。

 

 

方法

说明

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

 



 

 

 

注册编辑器

 

使用默认的编辑器

示例

@InitBinder

public void initBinder(WebDataBinder binder){

    binder.registerCustomEditor(String.classnew StringTrimmerEditor(true));

}

 

使用自定义编辑器

示例

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();

    }

}

 

@InitBinder

protected void initBinder(WebDataBinder binder){

 

    binder.registerCustomEditor(Double.classnew DoubleEditor());

}

 

 

 

类型转换

示例

@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));

}

 

 

 

参数绑定


示例

//给接口中的变量取别名

@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."); //绑定前缀

}

 

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