Validated参数校验框架(二)

断鸿 2020年03月05日 120次浏览

二、如何使用

1. 使用代码验证参数

<!-- jar包 -->
<dependency>
	<groupId>javax.validation</groupId>
	<artifactId>validation-api</artifactId>
	<version>2.0.1.Final</version>
</dependency>
<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-validator</artifactId>
	<version>5.2.4.Final</version>
</dependency>
/**
 * java bean
 **/
@Data
public class Prop {

    @NotNull(message = "validated.pId.cannot.be.null")
    @Min(value = 1, message = "pId.cannot.be.negative")
    private Long pId;

    @NotBlank(message = "pName.cannot.be.blank")
    private String pName;
}
/**
 * 校验工具类
 */
@Slf4j
public class ValidationUtils {

    private static Validator validator;
    private ValidationUtils() {
    }

    static {
        ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
        validator = validatorFactory.getValidator();
    }

    /**
     * 校验bean,失败时抛出运行时异常,返回第一个不符合校验参数的message
     * @param t
     * @param <T>
     */
    public static <T> void validate(T t) {

        Set<ConstraintViolation<T>> violationSet = validator.validate(t);
        if (!CollectionUtils.isEmpty(violationSet)) {
            ConstraintViolation<T> violation = violationSet.iterator().next();
            log.error("--violation--> {}", violation);
            throw new ValidationException(violation.getMessage());
        }
    }

    public static Validator getValidator() {
        return validator;
    }
}
/**
 * 测试
 */
@Slf4j
public class ValidationUtilsTest {

    @Test
    public void validate() {
        
        Prop prop = new Prop();
        try {
            ValidationUtils.validate(prop);
            log.info("校验通过");
        } catch (Exception e) {
            log.error(e.getMessage());
        }
    }
}

2. Spring Bean中的参数校验

@Validated 和 @Valid注解

@Valid 是javax提供的注解,而@Validated是Spring Validation验证框架提供的(Spring's JSR-303规范是标准JSR-303规范的一个变种)。
两者在基本的参数验证功能上没有太大区别。但在分组、注解地方、嵌套验证等功能上有所不同

  • 分组功能
    • @Validated: 提供分组功能,可以在入参验证时,根据不同的分组采取不同的验证机制
    • @Valid:没有分组功能
  • 注解地方
    • @Validated: 类型、方法、参数
    • @Valid: 方法、构造函数、参数、成员属性
  • 嵌套验证
    • @Validated: 无
    • @Valid:可用于嵌套验证

单个参数验证

/**
 * 1、使用@Validated注解在类上
 * 2、在方法的入参上添加constraint注解
 **/
 @Component
//@Service
@Slf4j
@Validated
public class MethodValidatedService {
    /**
     * 单个参数验证  @Validated注解在类上
     * @param name
     * @return
     */

    public String  methodValidatedParam(@NotNull String name) {
        return name;
    }
}

Java Bean参数验证

/**
 * Component
 * 在方法的入参上添加@Valid注解
 **/
 @Component
//@Service
@Slf4j
@Validated
public class MethodValidatedService {

    /**
     * 只能用Valid
     * @param prop
     * @return
     */
    public Prop methodValid( @Valid Prop prop) {
        return prop;
    }

    /**
     * 不起作用
     * @param prop
     * @return
     */
    public Prop methodValidated(@Validated Prop prop) {
        return prop;
    }
}
/**
 * Controller
 * 在方法的入参上添加@Valid或者@Validated注解
 **/
@RestController
@Slf4j
@RequestMapping("validate")
public class ValidatedController {

    @RequestMapping("validate")
    public Result validate(@Validated Prop prop) {
        return ResultUtil.success(prop);
    }

    @RequestMapping("valid")
    public Result valid(@Valid Prop prop) {
        return ResultUtil.success(prop);
    }

}