Spring MVC参数验证

Spring MVC提供了参数验证机制,一方面可以支持JSR-303注解验证,在默认的情况下Spring Boot会引入Hibernate Validator机制来支持JSR-303验证规范;另一方面,因为业务复杂,所以也支持自定义验证规则。

1.JSR-303验证

1.非空判断

@NotNull(message = "id不能为空")
private Long id;

2.时间判断

@Future(message = "需要一个将来日期")
//@Past(message = "需要一个过去日期")
@NotNull
private Date date;

3.范围判断

@NotNull
@DecimalMin(value = "0.1", message = "最小值0.1元")
@DecimalMax(value = "10000.00", message = "最大值10000元")
private Double value;
@NotNull
@Min(value = "1", message = "最小值为1")
@Max(value = "10", message = "最大致为10")
private Integer age;
@Range(min = 1, max = 99, message = "范围为1至88")
private Long range;

4.邮箱验证

@Email(message = "邮箱格式错误")
private String email;

5.长度验证

@Size(min = 20, max = 30, message = "字符串长度要求20到30质检")
private String size;

2.参数验证机制

为了更加灵活的提供验证机制,Spring还提供了自己的验证机制。在参数转换时,可以看到在Spring MVC中在WebDataBinder机制进行管理,在默认情况下Spring会自动地根据上下文通过注册了的转换器转换出参数所需的参数。在WebDataBinder中除了可以注册转换器外,还允许注册验证器(Validator)。
在Spring容器中,它允许使用注解@InitBinder,这个注解的作用允许在进入控制器方法钱修改WebDataBinder机制。Spring MVC验证接口

package org.springframework.validation;

public interface Validator {
    /** 判定当前验证器是否支持该Class类型的验证 */
    boolean supports(Class clazz);
    
     /** 如果supports返回true,则这个方法执行验证结果 */
    void validate(Object target, Errors errors);
}

这是Spring所定义的验证接口,他定义了两个方法,其中supports方法参数为需要验证的POJO类型,如果该方法返回true,则spring会使用当前验证器的validate方法区验证POJO。而validate方法包含需要的target对象和错误对象errors,其中target是参数绑定后的POJO,这样便可以通过这个参数对象进行业务逻辑的自定义验证。如果发现错误,则可以保存到errors对象中,然后返回给控制器。

public class UserValidator implements Validator {

    @Override
    public boolean supports(Class clazz) {
        return clazz.equals(User.class);
    }

    @Override
    public void validate(Object taget, Errors errors) {
        // 对象为空
        if (taget == null) {
            // 直接在报错参数处报错, 这样就不能进入控制器了
            errors.rejectValue("", "用户不能为空");
        }
        // 强制转换
        User user = (User) target;
        // 用户名非空串
        if (StringUtils.isBlank(user.getUserName())) {
            errors.rejectValue("userName", null, "用户名不能为空");
        }
    }
}

有了这个验证器,Spring还不会自动启动它,因为还没有绑定WebDataBinder机制。在Spring MVC中提供了一个注解@InitBinder,他的作用是在执行控制器方法前,处理器会先执行被@InitBinder标注的方法。这时可以将WebDataBinder对象作为参数传递到方法中,通过这层关系得到WebDataBinder对象,这个对象有一个setValidator方法,他可以绑定自定义的验证器,这样就可以在获取参数后,通过自定义验证器去验证参数。绑定验证器代码清单如下:

@RestController
@RequestMapping("/user")
public class UserController {
    
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        // 绑定验证器
        binder.setValidator(new UserValidator());
    }

}

你可能感兴趣的:(Spring MVC参数验证)