SpringAOP实现valid参数校验

it2025-10-08  3

最近在写项目的时候,在每一个controller都充满了大量的if来校验参数,而且每一个controller还不同,不能把校验的方法封装起来.特别麻烦,想了半天.有一个Java自带的参数校验,只要在对应的dto上面加上注解.绑定message,然后配合Spring的BindingResult result来获取返回信息,这样就可以较为友善的返回前台了.

javax.validation.constraints

废话不多说,直接上代码.

用拦截器也能实现类似的效果

@Aspect @Component public class ParamValidAspect { private static final Logger log = LoggerFactory.getLogger(ParamValidAspect.class); @Around("@annotation(checkParamIsValid)") public Object CheckParamIsValid(ProceedingJoinPoint point, CheckParamIsValid checkParamIsValid) throws Throwable { Object[] paramObj = point.getArgs(); if (paramObj.length > 0) { if (paramObj[1] instanceof BindingResult) { BindingResult result = (BindingResult) paramObj[1]; ResponseResult errorMap = this.validRequestParams(result); if (errorMap != null) { ServletRequestAttributes res = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletResponse response = res.getResponse(); response.setContentType("application/json;charset=UTF-8"); //这里可以设置响应的状态 //response.setStatus(HttpStatus.BAD_REQUEST.value()); response.setStatus(HttpStatus.OK.value()); OutputStream output = null; try { output = response.getOutputStream(); String error = new Gson().toJson(errorMap); log.info("aop 检测到参数不规范" + error); output.write(error.getBytes("UTF-8")); output.flush(); } catch (IOException e) { log.error(e.getMessage()); } finally { try { if (output != null) { output.close(); } } catch (IOException e) { log.error(e.getMessage()); } } } } // 如果校验不通过,也通过response响应了信息.直接返回空,不执行方法即可 return null; } else { return point.proceed(); } } /** * 校验 */ private ResponseResult validRequestParams(BindingResult result) { if (result.hasErrors()) { List<ObjectError> allErrors = result.getAllErrors(); List<String> lists = new ArrayList<>(); for (ObjectError objectError : allErrors) { lists.add(objectError.getDefaultMessage()); } return new ResponseResult<>().error(HttpStatus.BAD_REQUEST.value(), "传递参数有问题哦"); } return null; } }

附上注解

@Null 限制只能为null @NotNull 限制必须不为null @AssertFalse 限制必须为false @AssertTrue 限制必须为true @DecimalMax(value) 限制必须为一个不大于指定值的数字 @DecimalMin(value) 限制必须为一个不小于指定值的数字 @Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction @Future 限制必须是一个将来的日期 @Max(value) 限制必须为一个不大于指定值的数字 @Min(value) 限制必须为一个不小于指定值的数字 @Past 限制必须是一个过去的日期 @Pattern(value) 限制必须符合指定的正则表达式 @Size(max,min) 限制字符长度必须在min到max之间 @Past 验证注解的元素值(日期类型)比当前时间早 @NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0@NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty@NotBlank只应用于字符串且在比较时会去除字符串的空格 @Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
最新回复(0)