在写一个基于SpringAOP的权限控制的。

自己定义了一个注解,然后逻辑代码需要通过获取自定义注解的一个属性来进行权限控制。

下面简单上一下关键代码:

自定义注解:

@Documented  //有关java doc的注解
@Retention(RetentionPolicy.RUNTIME) //保留时间,这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用.
@Target(ElementType.METHOD) //针对方法
public @interface AuthorizationNeed { //自定义注解的属性,default是设置默认值
//String operation() default "addAndUpdate";
String operation(); //这个属性用来知道这是什么操作,不同操作的写法不一样 }

切点:

/**
* 定义个个切入点
* 所有有这个注解的方法
*/
@Pointcut("@annotation(com.inforPoint.util.AuthorizationNeed)")
private void needAuthorizationPoint() {}

然后在切面中有个@Around的环绕加强,需要在里面获取注解AuthorizationNeed的属性operation的值。  在网上找了个方法,这是一开始的写法:

//下面这句代码是获得那个自定义的注解的对象
AuthorizationNeed authorizationNeed = ( (MethodSignature)proceedingJoinPoint.getSignature() ).getMethod().getAnnotation(AuthorizationNeed.class); String operation = authorizationNeed.operation(); //用注解的时候有指明是什么操作

但却在运行的时候一直反应  这个authorizationNeed是null。

网上有说可能是注解的定义问题,要

@Retention(RetentionPolicy.RUNTIME)

但显然不是这个错。

后面百度了很久之后,原来是这个aop拦截的是ServiceImpl的一个方法,然后这个ServiceImpl又启动了事务管理,而事务管理又是基于AOP的。

也就是说,这个权限的@Around的切面拦截的是个代理对象的方法,而代理对象的方法是不会把原来父类中的方法的注解加上去的,所以这里这个注解的对象为null。后面网上找到了一个可以解决问题的代码:

/**
* 这个方法帮忙拿出注解中的operation属性
* 因为有拦截serviceImpl的方法,而这些方法又加了事务管理,也就是这里也有aop,这些已经是代理类,用之前的写法获得的是代理类的方法,而这些
* 方法是特么不会把父类中的方法的注解加上去的!!!
* @param proceedingJoinPoint
*/
private String getOperationOfTheAnnotation(ProceedingJoinPoint proceedingJoinPoint) throws Exception { Signature signature = proceedingJoinPoint.getSignature();//方法签名
Method method = ( (MethodSignature)signature ).getMethod(); //这个方法才是目标对象上有注解的方法
Method realMethod = proceedingJoinPoint.getTarget().getClass().getDeclaredMethod(signature.getName(), method.getParameterTypes()); AuthorizationNeed authorizationNeed = realMethod.getAnnotation(AuthorizationNeed.class); return authorizationNeed.operation(); }

参考博客:

https://www.cnblogs.com/qiumingcheng/p/5923928.html    贴近作者实际地讲这个问题

https://blog.csdn.net/frightingforambition/article/details/78842306

getAnnotation为null的坑的更多相关文章

  1. null的坑 和 比较运算符、相等运算符的隐式转换问题 (在javascript中,null>=0 为真,null<=0 为真,null==0却为假,null到底是什么?)

    null在关系运算中的坑 & 关系运算符的隐式转换问题 注意: 比较运算符 和 相等运算符 的 ECMAscript 语法实现不同. 比较运算符 和 相等运算符 对数据进行了隐式转换, 相当于 ...

  2. 关于 NULL的坑

    有如下的表: select * from testtable where name in ('name'):  结果是第一条: select * from testtable where name n ...

  3. 如何利用aop的环绕消息处理log, 以及各种坑的记录

    如何利用aop的环绕消息处理log, 以及各种坑的记录 本文链接: https://www.cnblogs.com/zizaiwuyou/p/11667423.html 因为项目里有很多地方要打log ...

  4. 我的Android进阶之旅------>解决Jackson等第三方转换Json的开发包在开启混淆后转换的实体类数据都是null的bug

    1.错误描述 今天测试人员提了一个bug,说使用我们的app出现了闪退的bug,后来通过debug断点调试,发现我们的app转换服务器发送过来的json数据后,都是为null.而之前已经提测快一个月的 ...

  5. Mysql高手系列 - 第13篇:细说NULL导致的神坑,让人防不胜防

    这是Mysql系列第13篇. 环境:mysql5.7.25,cmd命令中进行演示. 当数据的值为NULL的时候,可能出现各种意想不到的效果,让人防不胜防,我们来看看NULL导致的各种神坑,如何避免? ...

  6. mysql优化过程中遇见的坑(mysql优化问题特别注意)

    不要听信你看到的关于优化的“绝对真理”,包括本文所讨论的内容,而应该是在实际的业务场景下通过测试来验证你关于执行计划以及响应时间的假设. 单条查询最后添加 LIMIT 1,停止全表扫描. 对于char ...

  7. 十三、细说NULL导致的神坑,让人防不胜防

    当数据的值为NULL的时候,可能出现各种意想不到的效果,让人防不胜防,我们来看看NULL导致的各种神坑,如何避免? 一.比较运算符中使用NULL 任何值和NULL使用运算符(>.<.> ...

  8. 使用Spring Boot搭建应用开发框架(一) —— 基础架构

    Spring的简史 第一阶段:XML配置,在Spring1.x时代,使用Spring开发满眼都是xml配置的Bean,随着项目的扩大,我们需要把xml配置文件分放到不同的配置文件里,那时候需要频繁的在 ...

  9. 我的自定义框架 || 基于Spring Boot || 第一步

    今天在园子里面看到一位大神写的springboot做的框架,感觉挺不错,遂想起来自己还没有一个属于自己的框架,决定先将大神做好的拿过来,然后加入自己觉得需要的模块,不断完善 目前直接复制粘贴过来的,后 ...

随机推荐

  1. Appium——WebDriverException: Message: A new session could not be created.

    每次启动完一次脚本再次启动的时候会报这个错误,会话没有被创建 查看了下Appium日志: 查看下设备是否准备好,我用的是模拟器,就cmd下查看下设备: 可以看到设备掉线了... 好吧,重启下设备 脚本 ...

  2. 【mysql】mysql innodb 配置详解

    MySQL innodb 配置详解 innodb_buffer_pool_size:这是InnoDB最重要的设置,对InnoDB性能有决定性的影响.默认的设置只有8M,所以默认的数据库设置下面Inno ...

  3. PYTHON 爬虫笔记二:Urllib库基本使用

    知识点一:urllib的详解及基本使用方法 一.基本介绍 urllib是python的一个获取url(Uniform Resource Locators,统一资源定址器)了,我们可以利用它来抓取远程的 ...

  4. 重装系统后texstudio拼写检查不工作

    重装texstudio还是不行. 后来发现是重装系统后用户名和以前的系统用户明不一样,导致系统盘里的用户文件夹路径不一样.而texstudio的字典存放在用户路径文件夹下 C:\Users\xxx\A ...

  5. .Net-Mongodb学习大全网址

    http://www.yuanjiaocheng.net/csharpmongo/16.html 介绍 在上一篇文章中,我们继续探索MongoDb .NET驱动程序中的数据序列化. 我们查看了各种属性 ...

  6. gitblit安装使用

    1.下载地址 http://www.gitblit.com/ 2.安装jdk(自行安装) 3.解压gitblit # tar -zxvf gitblit-1.8.0.tar.gz 4.配置# cd g ...

  7. 最基本PSO算法的C++实现

    按照James Kennedy & Russell Eberhart (1995)的版本,算法过程如下: [x*] = PSO() P = Particle_Initialization(); ...

  8. 「LuoguP1341」 无序字母对(欧拉回路

    题目描述 给定n个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒).请构造一个有n+1个字母的字符串使得每个字母对都在这个字符串中出现. 输入输出格式 输入格式: 第一行输入一 ...

  9. vi编辑器的使用(2)

    1.4 光标移动 vi编辑器中的很多命令都是基于光标当前位置的,因此,如何移动光标定位到所需要的位置是一项十分重要的工作,下面进行详细介绍(如无特别说明,下面所讲的命令都是在普通模式下执行). 1. ...

  10. DTP模型之二:(XA协议之二)JTA集成JOTM或Atomikos配置分布式事务(Tomcat应用服务器)

    jotm只能用的xapool数据源,而且很少更新. 一.以下介绍Spring中直接集成JOTM提供JTA事务管理.将JOTM集成到Tomcat中. (经过测试JOTM在批量持久化时有BUG需要修改源码 ...