Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 自定义注解实现springMVC 参数校验非空判断,为空 则返回响应为空信息

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

作者头像
爱明依
发布于 2019-03-12 07:40:58
发布于 2019-03-12 07:40:58
7.7K00
代码可运行
举报
文章被收录于专栏:爱明依爱明依
运行总次数:0
代码可运行

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

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

二:明确注解的作用

三:开始编写注解定义

四:编写注解切面类

下面附上代码:

一:注解定义如下:

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RequestRequire {

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

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

二:切面类代码如下:

分析代码:

@Aspect 表明这个类是切面类 

@Component 这个类交由Spring管理

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

切面类的核心方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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
代码运行次数:0
运行
AI代码解释
复制
@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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
spring的aop注解(java自定义注解)
该篇以记录接口调用的传入参数日志为场景,来介绍下使用自定义注解作为切点,AOP切面方式去记录每个接口的传入参数以及可扩展的业务处理。
全栈程序员站长
2022/07/29
8020
spring的aop注解(java自定义注解)
Spring AOP技术原理及利用自定义注解验证数据正确性
1. 切面(Aspect):一个切面由多个通知(Advice)组成,代表了交叉业务逻辑的模块。通知包含了要在目标方法执行前后执行的代码。
用户7353950
2024/04/30
3370
Spring AOP技术原理及利用自定义注解验证数据正确性
怎么在Java中自定义注解?
注解是JDK1.5引入的新特性,主要用于简化代码,提高编程的效率。其实在日常开发中,注解并不少见,比如Java内置的@Override、@SuppressWarnings,或者Spring提供的@Service、@Controller等等,随着这些注解使用的频率越来越高,作为开发人员当真有必要深入学习一番。
java技术爱好者
2021/03/15
3.5K0
java自定义注解
文章目录 1. 自定义注解【Annotation】 1.1. 元注解 1.1.1. @Retention 1.1.2. @Target 1.1.3. @Document 1.1.4. @Inherited 1.2. 关于注解的反射方法 1.3. 五种通知 1.4. JoinPoint 对象 1.5. 实战 1.5.1. 日志 1.5.2. 性能监控 1.5.3. 输出错误日志到文件中 1.6. 参考文章 自定义注解【Annotation】 元注解 @Retention 表示需要在什么级别保存该注解信息
爱撒谎的男孩
2019/12/31
1.1K0
JAVA自定义注解SpringAOP
前言:Annotation(注解)是JDK5.0及以后版本引入的,它的作用就是负责注解其他注解。现在开发过程中大家都已经放弃了传统的XML配置的方式改为注解的方式,既简单又简洁,方便管理和维护。目前引用第三方jar包的注解都是解决技术上的问题,然而我们在工作中也需要通过注解解决业务上的一些问题,所以就得用到自定义注解。
王念博客
2019/07/24
4390
SpringBoot 通过自定义注解实现AOP切面编程实例
一直心心念的想写一篇关于AOP切面实例的博文,拖更了许久之后,今天终于着手下笔将其完成。
翎野君
2023/05/12
1.3K0
SpringBoot 通过自定义注解实现AOP切面编程实例
通过AOP和自定义注解实现请求日志收集功能
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/linzhiqiang0316/article/details/89638245
林老师带你学编程
2019/05/25
1.6K0
Springboot自定义注解,支持SPEL表达式
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/15
8240
自定义注解实现参数验证与业务代码解耦
核心依赖 <!-- aop --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>${springframework.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId>
Meet相识
2018/09/12
1.3K0
SpringBoot如何创建一个自定义注解
奇怪的Java
2024/03/17
4600
使用AOP+自定义注解完成spring boot的接口权限校验
定义解析注解的MyAnnotationService,完成接口权限校验的逻辑,这里我是获取接口请求时header中的user_name参数,进行校验:
玖柒的小窝
2021/09/15
7390
使用AOP+自定义注解完成spring boot的接口权限校验
SpringMVC参数校验,包括JavaBean和基本类型的校验
该示例项目使用SpringBoot,添加web和aop依赖。 SpringMVC最常用的校验是对一个javaBean的校验,默认使用hibernate-validator校验框架。而网上对校验单个参数,譬如String,int之类的资料极少,这一篇就是讲这个的。
天涯泪小武
2019/01/17
1.6K0
自定义注解使用AOP做权限校验
最近看 RocketMQ 源码时,发现它是使用自定义注解的方式做权限校验,蛮有意思的,于是简单上手试了一下。
程序员Alan
2022/11/03
2980
自定义注解实现防止重复提交
腾云先锋(TDP,Tencent Cloud Developer Pioneer)是腾讯云GTS官方组建并运营的技术开发者群体。这里有最专业的开发者&客户,能与产品人员亲密接触,专有的问题&需求反馈渠道,有一群志同道合的兄弟姐妹。来加入属于我们开发者的社群吧!
无敌小菜鸟
2022/03/12
1.2K1
自定义注解实现防止重复提交
spring自己实现注解(自定义注解方法名)
现在我们已经有了这样的一个简单的web项目了,直接访问localhost:8080/user/6后,显然会得到一个如下的json串
全栈程序员站长
2022/07/28
1.2K0
spring自己实现注解(自定义注解方法名)
SpringBoot 自定义注解 + AOP实现参数效验,默认值赋值
在进行Web开发时,对于一些接口,我们需要对参数进行效验来保证接口的正确性。同时,对于参数中某些项缺失的情况,我们需要给这些缺失的参数设置默认值。这时候,SpringBoot的自定义注解和AOP技术就派上用场了。
网络技术联盟站
2023/06/05
3.4K0
Java自定义注解:定义、解析,AOP切面与日志打印
本文主要介绍了 Java 中的自定义注解以及结合 AOP(面向切面编程)技术进行日志记录的方法。
Yeats_Liao
2025/01/10
4990
Java自定义注解:定义、解析,AOP切面与日志打印
自定义注解实现服务的动态开关
接近凌晨了,今天的稿子还没来得及写,甚是焦虑,于是熬了一个夜也的给它写完。正如我的题目所说:《自定义注解实现服务动态开关》,接下来和shigen一起来揭秘吧。
shigen
2023/11/15
3870
自定义注解实现服务的动态开关
医院项目中,如何使用自定义注解?
不管是项目中,还是各种框架中,都有着大量的注解。而且,我们在项目开发中,通常一个注解就能搞定好多事情,尤其是在Spring大家族里,注解那是被玩的飞起,另外其他框架中不少使用。
田维常
2022/11/25
7590
医院项目中,如何使用自定义注解?
自定义注解1-实现spel表达式
开发中多多少少会使用spel,spel是Spring3引入了Spring表达式语言(Spring Expression Language,SpEL),在一些配置中,注解中经常用到,可谓是神器。比如说spring中的@Cacheable注解,其中key、unless等属性都支持Spel。举个例子:
并发笔记
2020/10/26
4.3K0
相关推荐
spring的aop注解(java自定义注解)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验