Java 自定义注解实现springMVC 参数校验非空判断,为空 则返回响应为空信息

欢迎关注博主公众号:【纯洁的明依】文章由陈晓阳原创。
本人微信:chenxiaoyangzxy. 免费提供本人大量学习资料。

简单概括定义注解的步骤以及作用:

一:明确注解的使用空间(类 方法 等)

二:明确注解的作用

三:开始编写注解定义

四:编写注解切面类

下面附上代码:

一:注解定义如下:

因为我们要做一个非空校验参数,那么使用注解就必须把 非空的字段传入进去。

这些非空的字段是属于哪一个类的呢?那么久需要定义一个对象所属类。

 

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RequestRequire {

    /**
     * 请求当前接口所需要的参数,多个以小写的逗号隔开
     * @return
     */
    public String require() default "";

    /**
     *传递参数的对象类型
     */
    public Class<?> parameter() default Object.class;
}

 

二:切面类代码如下:

分析代码:

@Aspect 表明这个类是切面类 

@Component 这个类交由Spring管理

 

@Pointcut("@annotation(com.bonc.ioc.iot.annotation.RequestRequire)")
表明这个切面类是为哪一个注解服务的
 
around

切面类的核心方法。

 

 

@Aspect
@Component
public class RequestRequireAspect {

    protected  Logger log=Logger.getLogger(RequestRequireAspect.class);


    public RequestRequireAspect() {
//        log.info("初始化接口参数非空判断切面类...");
    }

    @Pointcut("@annotation(com.bonc.ioc.iot.annotation.RequestRequire)")
    public void controllerInteceptor() {
    }

    @Around("controllerInteceptor()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {

        //获取注解的方法参数列表
        Object[] args = pjp.getArgs();

        //获取被注解的方法
        MethodInvocationProceedingJoinPoint mjp = (MethodInvocationProceedingJoinPoint) pjp;
        MethodSignature signature = (MethodSignature) mjp.getSignature();
        Method method = signature.getMethod();

        //获取方法上的注解
        RequestRequire require = method.getAnnotation(RequestRequire.class);

        //以防万一,将中文的逗号替换成英文的逗号
        String fieldNames=require.require().replace(",", ",");

        //从参数列表中获取参数对象
        Object parameter=null;
        for(Object pa:args){
            //class相等表示是同一个对象
            if (pa.getClass()==require.parameter() ) {
                parameter=pa;
            }
        }

        //通过反射去和指定的属性值判断是否非空
        Class cl=parameter.getClass();
        for(String fieldName:fieldNames.split(",")){

            //根据属性名获取属性对象
//            Field f=cl.getDeclaredField(fieldName);

            Field f=ReflectUtil.getDeclaredFields(parameter,fieldName);

            //设置可读写权限
            f.setAccessible(true);


            //获取参数值,因为我的参数都是String型所以直接强转
            Object value=f.get(parameter);

            //非空判断
            if(value==null||!StringUtil.isNotNull(value.toString())){
                log.error("参数:"+fieldName+"不允许为空");
                //将异常写会页面
                AppReply appReply=AppReply.error("参数:"+fieldName+"不允许为空", ExceptionCodeUtil.IOCE_AS002);
                ConvertObject2Json.writeJson(appReply,HttpServletUtil.getHttpServletRequest(),HttpServletUtil.getHttpServletResponse());
                 throw new IllegalArgumentException("参数"+fieldName+"不允许为空");
            }
        }

        //如果没有报错,放行
        return pjp.proceed();
    }
}

 

三:

COntroller 使用方法:

 

@RequestMapping(value = "getIotParserServiceById")
@ResponseBody
@RequestRequire(require="serviceId",parameter=IotParserService.class)
public AppReply<IotParserService> getIotParserServiceById(IotParserService iotParserService) {
    AppReply<IotParserService> data=new AppReply<IotParserService>();
    try{
        iotParserService=iotParserServiceService.getIotParserServiceById(iotParserService.getServiceId());
        data=AppReply.success(iotParserService);
    }catch(Exception e){
        data=AppReply.error("根据服务Id找不到记录", ExceptionCodeUtil.IOCE_AS002);
        logger.error(e.getStackTrace());
    }
    return data;
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纯洁的明依

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值