简介

• 用于@Controller中标注的方法上,表示为当前控制器注册一个属性编辑器,只对当前的Controller有效。

• 由 @InitBinder 标识的方法,可以对 WebDataBinder 对象进行初始化。WebDataBinder 是 DataBinder 的子类,用于完成由表单字段到 JavaBean 属性的绑定。

• @InitBinder方法不能有返回值,它必须声明为void。

• @InitBinder方法的参数通常是 WebDataBinder。

DataBinder类常用方法及其描述(WebDataBinder 是 DataBinder 的子类)

修饰符和类型 方法和描述
void addCustomFormatter(Formatter<?> formatter)

添加自定义格式化程序,将其应用于与Formatter-declared类型匹配的所有字段 。

void addCustomFormatter(Formatter<?> formatter, java.lang.Class<?>... fieldTypes)

添加自定义格式化程序,仅将其应用于指定的字段类型(如果有),或者应用于与Formatter-declared类型匹配的所有字段。

void addCustomFormatter(Formatter<?> formatter, java.lang.String... fields)

为类中指定的字段类型添加自定义格式化程序,Formatter仅将其应用于指定的字段(如果有),或者应用于所有字段。

void addValidators(Validator... validators)

添加验证器以在每个绑定步骤后应用。

protected void applyPropertyValues(MutablePropertyValues mpvs)

将给定的属性值应用于目标对象。

void bind(PropertyValues pvs)

将给定的属性值绑定到此绑定程序的目标。

protected void checkAllowedFields(MutablePropertyValues mpvs)

根据允许的字段检查给定的属性值,删除不允许的字段的值。

protected void checkRequiredFields(MutablePropertyValues mpvs)

根据所需字段检查给定的属性值,并在适当的位置生成缺少的字段错误。

java.util.Map<?,?> close()

关闭此DataBinder,如果遇到任何错误,可能会导致抛出BindException。

<T> T convertIfNecessary(java.lang.Object value, java.lang.Class<T> requiredType)

将值转换为所需类型(如果需要,从String)。

<T> T convertIfNecessary(java.lang.Object value, java.lang.Class<T> requiredType, java.lang.reflect.Field field)

将值转换为所需类型(如果需要,从String)。

<T> T convertIfNecessary(java.lang.Object value, java.lang.Class<T> requiredType, MethodParameter methodParam)

将值转换为所需类型(如果需要,从String)。

<T> T convertIfNecessary(java.lang.Object value, java.lang.Class<T> requiredType, TypeDescriptor typeDescriptor)

将值转换为所需类型(如果需要,从String)。

protected AbstractPropertyBindingResult createBeanPropertyBindingResult()

AbstractPropertyBindingResult使用标准JavaBean属性访问创建实例。

protected AbstractPropertyBindingResult createDirectFieldBindingResult()

AbstractPropertyBindingResult使用直接字段访问创建实例。

protected void doBind(MutablePropertyValues mpvs)

绑定过程的实际实现,使用传入的MutablePropertyValues实例。

java.beans.PropertyEditor findCustomEditor(java.lang.Class<?> requiredType, java.lang.String propertyPath)

查找给定类型和属性的自定义属性编辑器。

java.lang.String[] getAllowedFields()

返回应该允许绑定的字段。

int getAutoGrowCollectionLimit()

返回阵列和集合自动增长的当前限制。

BindingErrorProcessor getBindingErrorProcessor()

返回处理绑定错误的策略。

BindingResult getBindingResult()

返回此DataBinder创建的BindingResult实例。

ConversionService getConversionService()

返回关联的ConversionService(如果有)。

java.lang.String[] getDisallowedFields()

返回应该字段不能被允许的结合。

protected AbstractPropertyBindingResult getInternalBindingResult()

返回此DataBinder持有的内部BindingResult,作为AbstractPropertyBindingResult。

java.lang.String getObjectName()

返回绑定对象的名称。

protected ConfigurablePropertyAccessor getPropertyAccessor()

返回此绑定器的BindingResult的基础PropertyAccessor。

protected PropertyEditorRegistry getPropertyEditorRegistry()

返回此绑定器的BindingResult的基础TypeConverter。

java.lang.String[] getRequiredFields()

返回每个绑定过程所需的字段。

protected SimpleTypeConverter getSimpleTypeConverter()

返回此binder的底层SimpleTypeConverter。

java.lang.Object getTarget()

返回包装的目标对象。

protected TypeConverter getTypeConverter()

返回此绑定器的BindingResult的基础TypeConverter。

Validator getValidator()

返回主要验证程序以在每个绑定步骤后应用(如果有)。

java.util.List<Validator> getValidators()

返回验证器以在数据绑定后应用。

void initBeanPropertyAccess()

初始化此DataBinder的标准JavaBean属性访问权限。

void initDirectFieldAccess()

初始化此DataBinder的直接字段访问,作为默认bean属性访问的替代方法。

protected boolean isAllowed(java.lang.String field)

如果允许给定字段进行绑定,则返回。

boolean isAutoGrowNestedPaths()

返回是否已激活嵌套路径的“自动增长”。

boolean isIgnoreInvalidFields()

返回绑定时是否忽略无效字段。

boolean isIgnoreUnknownFields()

返回绑定时是否忽略未知字段。

void registerCustomEditor(java.lang.Class<?> requiredType, java.beans.PropertyEditor propertyEditor)

为给定类型的所有属性注册给定的自定义属性编辑器。

void registerCustomEditor(java.lang.Class<?> requiredType, java.lang.String field, java.beans.PropertyEditor propertyEditor)

为给定的类型和属性或给定类型的所有属性注册给定的自定义属性编辑器。

void replaceValidators(Validator... validators)

在每个绑定步骤后替换要应用的验证器。

void setAllowedFields(java.lang.String... allowedFields)

注册应该允许绑定的字段。

void setAutoGrowCollectionLimit(int autoGrowCollectionLimit)

指定阵列和集合自动增长的限制。

void setAutoGrowNestedPaths(boolean autoGrowNestedPaths)

设置此绑定程序是否应尝试“自动增长”包含空值的嵌套路径。

void setBindingErrorProcessor(BindingErrorProcessor bindingErrorProcessor)

设置用于处理绑定错误的策略,即必需的字段错误和PropertyAccessExceptions。

void setConversionService(ConversionService conversionService)

指定用于转换属性值的Spring 3.0 ConversionService,作为JavaBeans PropertyEditors的替代方法。

void setDisallowedFields(java.lang.String... disallowedFields)

注册应该字段不能被允许的结合。

void setIgnoreInvalidFields(boolean ignoreInvalidFields)

设置是否忽略无效字段,即是否忽略目标对象中具有不可访问的相应字段的绑定参数(例如,由于嵌套路径中的空值)。

void setIgnoreUnknownFields(boolean ignoreUnknownFields)

设置是否忽略未知字段,即是否忽略目标对象中没有相应字段的绑定参数。

void setMessageCodesResolver(MessageCodesResolver messageCodesResolver)

设置用于将错误解析为消息代码的策略。

void setRequiredFields(java.lang.String... requiredFields)

注册每个绑定过程所需的字段。

void setValidator(Validator validator)

设置Validator以在每个绑定步骤后应用。

void validate()

调用指定的Validators(如果有)。

void validate(java.lang.Object... validationHints)

使用给定的验证提示调用指定的Validators(如果有)。

例如

(不获取指定标签的值,即不获取username的值)

UserInfo.class(JavaBean)

package com.user;

import lombok.Getter;
import lombok.Setter;

@Setter
@Getter
public class UserInfo {

    private String username;
    private String userpass;
    private String useremail;
    private String userage;

    private Address address;

    public UserInfo() {
        super();
    }

    public UserInfo(String username, String userpass, String useremail, String userage, Address address) {
        this.username = username;
        this.userpass = userpass;
        this.useremail = useremail;
        this.userage = userage;
        this.address = address;
    }

    @Override
    public String toString() {
        return "UserInfo{" +
                "username='" + username + '\'' +
                ", userpass='" + userpass + '\'' +
                ", useremail='" + useremail + '\'' +
                ", userage=" + userage +
                ", address=" + address +
                '}';
    }
}

index.jsp

<%--
  Created by IntelliJ IDEA.
  User: 23369
  Date: 3/31/2019
  Time: 3:03 PM
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>$Title$</title>
</head>
<body>
<form action="testInitBinder" method="post">
  <input type="text" name="username"><br>
  <input type="text" name="userpass"><br>
  <input type="text" name="useremail"><br>
  <input type="text" name="userage"><br>
  <input type="text" name="address.procity"><br>
  <input type="text" name="address.city"><br>
  <input type="submit" value="提交">
</form>
</body>
</html>

TestInitBinder.class

package com.hello2;


import com.user.UserInfo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class TestInitBinder {

    @RequestMapping("testInitBinder")
    public String testInitBinder(UserInfo userInfo){

        System.out.println(userInfo);

        return "success";
    }


    @InitBinder
    public void initBinder(WebDataBinder webDataBinder){
        webDataBinder.setDisallowedFields("username");
    }
}