java用注解优雅校验入参
1.在controller层添加注解@Validated
@validated和@valid注解都能进行参数校验
区别在于@Validated是Spring提供,@Valid是jdk提供,@Validated功能更为强大,提供了分组功能和验证排序功能
@GetMapping("/loginByUsername")@Operation(summary = "账号登录")public Result<Object> loginByUsername(@Validated @RequestBody SuperAdminParam superAdminParam){return Result.success(superAdminManager.loginByUsername(superAdminParam));}
2.在入参实体类添加校验注解
@NotNull是校验不为空
@NotBlank是校验字符串不为null且去掉前后空格后长度大于0
@Data
public class SuperAdminParam extends BasePageQuery{@NotBlank(message = "账号不能为空")private String username;@NotBlank(message = "密码不能为空")private String password;...
}
注意:如果是get请求,在controller类上添加@Validated注解,然后在参数前加上相应的注解校验即可
...
@Validated
public class SuperAdminController {...public Result<Object> detail(@NotNull(message = "id不能为空") Integer id){...}
3.添加Validation配置
默认的是对所有的实体类属性进行验证,之后才会抛出异常,这里配置成只要检测到一个参数有问题就直接抛出异常
@Configuration
public class ValidatorConfig {/*** validation校验配置*/@Beanpublic Validator validator() {ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory();Validator validator = validatorFactory.getValidator();return validator;}
}
4.定义全局异常处理进行返回
@ExceptionHandler(value = MethodArgumentNotValidException.class)public Result<?> validateException(MethodArgumentNotValidException e) {List<FieldError> fieldErrors = e.getBindingResult().getFieldErrors();List<String> list = new ArrayList<>();for (FieldError error : fieldErrors) {list.add(error.getField() + error.getDefaultMessage());}return Result.error(500, list.get(0).toString());}@ExceptionHandler(value = ConstraintViolationException.class)public Result<?> validateException(ConstraintViolationException e) {Set<ConstraintViolation<?>> violations = e.getConstraintViolations();List<String> list = new ArrayList<>();for (ConstraintViolation<?> item : violations) {list.add(item.getMessage());}return Result.error(500, list.get(0).toString());}