@validate手动校验: 解决service层无法校验的问题
- pom.xml文件中导入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
- 校验代码
private static void validate(Object o) { Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); Set<ConstraintViolation<Object>> set = validator.validate(o); for (ConstraintViolation<Object> constraintViolation : set) { throw new IllegalArgumentException(constraintViolation.getMessage()); } }
自定义校验注解: 必须为固定的数字
@Documented
@Constraint(validatedBy = {MustInConstraintValidator.class}) // 使用下面的校验器,可以有多个
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})
@Retention(RUNTIME)
public @interface MustIn {
String message();
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
int[] values();
}
public class MustInConstraintValidator implements ConstraintValidator<MustIn, Integer> {
private List<Integer> values = new ArrayList<>();
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
// 包含则校验通过
return values.contains(value);
}
@Override
public void initialize(MustIn constraintAnnotation) {
// 获取注解中values的值
for (int value : constraintAnnotation.values()) {
values.add(value);
}
}
}
校验List失败
使用
@Validated
对整 UserController 进行校验,再使用@Valid
对 List 进行校验
@RequestMapping("/survey/question")
@Validated
public class UserController {
@PostMapping("/saveBatch")
public Result<String> saveBatch(@RequestBody @Valid List<User> userList) {
// ...
return Result.success("success");
}
}