通过自定义注解+aop实现参数校验

该博客介绍了一种使用自定义注解和AOP(面向切面编程)来校验方法参数的方法。`@CheckParam`、`@IsStrNotBlank`和`@IsNotNull`注解用于标记需要检查的参数,如非空字符串和非null对象。在AOP拦截器中,这些注解被用来检测并处理无效参数,返回400错误响应,包含详细的错误信息。这提供了一种优雅的方式来确保方法调用时参数的有效性。
摘要由CSDN通过智能技术生成

需要提供三个注解
@CheckParam,标记需要检查参数的方法
@IsStrNotBlank,标记检查字符串是否为空
@IsStrNotBlank,标记检查对象是否为null

/**
 * 校验标记注解
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckParam {

 }
/**
 * 不能为null
 */
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface IsNotNull {

    String value();
}
/**
 * 不能为空
 */
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface IsStrNotBlank {

     String value();
}

AOP部分

@Aspect
@Component
@Slf4j
public class CheckParamAop {

    @Autowired
    private HttpServletResponse rsp;
    
    @Around("@annotation(com.doria.electronicContract.annotation.CheckParam)")
    public Object repeatSubmitIntercept(ProceedingJoinPoint pjp) throws Throwable {
        rsp.setContentType("text/json;charset=UTF-8");
        Object[] args = pjp.getArgs();

        MethodSignature signature = (MethodSignature) pjp.getSignature();
        Annotation[][] parameterAnnotations = signature.getMethod().getParameterAnnotations();
        boolean flag = true;
        ArrayList<String> blankStrParam = new ArrayList<>();
        ArrayList<String> nullObjParam = new ArrayList<>();
        for (int i = 0; i < args.length; i++) {
            for (Annotation annotation : parameterAnnotations[i]) {
                if (annotation instanceof IsStrNotBlank) {
                    if (args[i] == null || "".equals(args[i])) {
                        flag = false;
                        String value = ((IsStrNotBlank) annotation).value();
                        blankStrParam.add(value);
                    }
                } else if (annotation instanceof IsNotNull) {
                    if (args[i] == null) {
                        flag = false;
                        String value = ((IsNotNull) annotation).value();
                        nullObjParam.add(value);
                    }
                }
            }
        }
        if (flag) {
            return pjp.proceed();
        }
        rsp.setStatus(400);
        String json = getBadParamResult(blankStrParam, nullObjParam).toString();
        rsp.getWriter().write(json);
        rsp.getWriter().close();
        log.error("参数异常,{}",json);
        return null;
    }

    // 传入异常参数生成响应Json
    public Object getBadParamResult(ArrayList<String> badStrParam, ArrayList<String> nullObjParam) {
        String msg = "";
        if (badStrParam.size() != 0) {
            msg = msg + "参数" + badStrParam + "不能为null或者空";
        }
        if (nullObjParam.size() != 0) {
            if (msg.length() > 1)
                msg = msg + ",";
            msg = msg + "参数" + nullObjParam + "不能为null";
        }
        return "{\"code\":400,\"msg\":\"" + msg + "\"}";
    }
}

使用
在这里插入图片描述
请求以及响应
在这里插入图片描述

使用
在这里插入图片描述

请求&响应
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值