前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 自定义注解实现springMVC 参数校验非空判断,为空 则返回响应为空信息

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

作者头像
爱明依
发布2019-03-12 15:40:58
7.4K0
发布2019-03-12 15:40:58
举报
文章被收录于专栏:爱明依爱明依

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

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

二:明确注解的作用

三:开始编写注解定义

四:编写注解切面类

下面附上代码:

一:注解定义如下:

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

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

代码语言:javascript
复制
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RequestRequire {

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

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

二:切面类代码如下:

分析代码:

@Aspect 表明这个类是切面类 

@Component 这个类交由Spring管理

代码语言:javascript
复制
@Pointcut("@annotation(com.bonc.ioc.iot.annotation.RequestRequire)")
代码语言:javascript
复制
表明这个切面类是为哪一个注解服务的
代码语言:javascript
复制
代码语言:javascript
复制
around

切面类的核心方法。

代码语言:javascript
复制
@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 使用方法:

代码语言:javascript
复制
@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;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年11月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档