spring-webmvc @InitBinder 典型用法

典型用法

注册自定义类型转换器(PropertyEditor / Converter)

用于将请求参数中的字符串转换为特定类型,比如 Date、LocalDate 等。

@InitBinder
public void initDateBinder(WebDataBinder binder) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, false));
}

设置字段白名单(防止字段注入攻击)

有些字段是敏感字段,你不希望用户通过请求随意修改,比如 id、role、isAdmin 等。

@InitBinder
public void initFieldWhitelist(WebDataBinder binder) {
    binder.setAllowedFields("name", "email", "birthDate"); // 只允许这些字段被绑定
}

如果用户传了 id=123,Spring 将忽略这个字段,不会赋值给对象。

添加验证器(Validator)

结合 Validator 接口,可以对绑定后的对象进行业务规则校验。

@InitBinder
public void initValidator(WebDataBinder binder) {
    binder.addValidators(new UserValidator());
}

然后在控制器方法中使用 @Valid 启动验证:

@PostMapping("/users")
public String createUser(@Valid User user, BindingResult result) {
    if (result.hasErrors()) {
        return "error";
    }
    return "success";
}

多个 @InitBinder 方法(可按名称绑定)

你可以写多个 @InitBinder 方法,并指定它们只作用于某个类或字段名。

@InitBinder("user")
public void initUserBinder(WebDataBinder binder) {
    binder.setAllowedFields("name", "email");
}

@InitBinder("product")
public void initProductBinder(WebDataBinder binder) {
    binder.setAllowedFields("name", "price");
}

与 @ControllerAdvice 结合实现全局配置

如果你希望所有控制器都共享某些绑定规则(如统一日期格式),可以使用 @ControllerAdvice + @InitBinder:

@ControllerAdvice
public class GlobalBindingConfig {

    @InitBinder
    public void globalInitBinder(WebDataBinder binder) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));
    }
}

这样所有控制器都会默认支持这种日期格式。

你可能感兴趣的:(注解,spring,java,后端)