SpringAOP实现valid参数校验

2023-01-29 12:59:26

最近在写项目的时候,在每一个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格式
  • 作者:七年后的七年前
  • 原文链接:https://blog.csdn.net/weixin_47933000/article/details/109218793
    更新时间:2023-01-29 12:59:26