二、如何使用
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);
}
}