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

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

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

二:明确注解的作用

三:开始编写注解定义

四:编写注解切面类

下面附上代码:

一:注解定义如下:

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

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

@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;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏米扑专栏

MongoDB MongoVue 客户端

MongoVue,是一款MongoDB的客户端工具,1.0版本的开始收费了,本文最后提供免费破解版v1.5.3。

55520
来自专栏AIUAI

Datasets - Related to Human

11430
来自专栏有困难要上,没有困难创造困难也要上!

使用Sqoop从Postgresql中导入数据到Hive中

这里假定已经准备好了现成的Hadoop,Hive,Hbase,Zookeeper和一个postgresql数据库。

38830
来自专栏AIUAI

Caffe2 - (二)Distributed Training分布式训练

Caffe2 最重要的一个特点是,便于分布式训练,无须重构设计即可快速实现网络的伸缩.

30040
来自专栏AIUAI

Caffe2 - (九)MNIST 手写字体识别

24250
来自专栏米扑专栏

CentOS 7 sytemctl 自定义服务开机启动

CentOS 7继承了RHEL 7的新的特性,例如强大的systemctl,而systemctl的使用也使得系统服务的/etc/init.d的启动脚本的方式发生...

31750
来自专栏AIUAI

PymongoDB - 简单用法

for data in coll.find({'key':value}): print data

20340
来自专栏米扑专栏

MongoDB Java 连接

42440
来自专栏米扑专栏

Clojure 学习入门(7)—— 连接mysql

Clojure的contrib包中实现了对现有JDBC的封装,在wiki上有连接,该页面上包含了对不同的数据库的连接方法和基本的操作,但是这个页面上没有提供足够...

12320
来自专栏米扑专栏

WordPress 建立数据库连接时出错解决方法

周末外出和朋友一起钓鱼去了,晚上回来准备在自己的米扑博客(http://blog.mimvp.com)写一篇钓鱼游记,打开电脑结果发现博客网站打不开了,提示”建...

48210

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励