您现在的位置是:首页 > 技术人生 > 后端技术后端技术
记一次SpringBoot Aspect不生效解决过程
高晓波2020-10-22【后端技术】人已围观
简介项目中两个aspect,一个环绕controller,用于记录日志,能够正常在point处进入aspect处理;另一个aspect 的point设于service,死活不能进入。
问题描述
项目中两个aspect,一个环绕controller,用于记录日志,能够正常在point处进入aspect处理;另一个aspect 的point设于service,死活不能进入。
解决思路
1、首先排查pointcut配置是否正确,检查后发现没有问题;
2、我们都知道spring的aop运用的是动态代理技术,由spring托管的bean大多为代理bean,controller层打印service对象,发现service对象竟然直接是service实现类的“本尊”。如下图所示:
再看springboot启动日志,发现roleServiceImpl实例化的时候有如下提示:
Bean 'roleServiceImpl' of type [com.gaoxiaobo.wms.service.impl.RoleServiceImpl] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
那么问题就明了了,我们在controller层调用的roleServiceImpl对象非代理对象而是其本身,那么对其的aspect是不会生效的,不仅aspsect不会生效,事务注解@Transactional也不会生效,问题还是相当严重的。
那么,why 没有生成其代理对象呢?一定是哪里先调用了roleServiceImpl导致spring优先实例化了该bean;
通过排查,找到了罪魁祸首:shiro 的LifecycleBeanPostProcessor优先实例化自定义Realm,自定义的Realm依赖于roleService,导致roleService被初始化。
解决方法
自定义realm中roleService设置成懒加载。
项目中两个aspect,一个环绕controller,用于记录日志,能够正常在point处进入aspect处理;另一个aspect 的point设于service,死活不能进入。
解决思路
1、首先排查pointcut配置是否正确,检查后发现没有问题;
2、我们都知道spring的aop运用的是动态代理技术,由spring托管的bean大多为代理bean,controller层打印service对象,发现service对象竟然直接是service实现类的“本尊”。如下图所示:
再看springboot启动日志,发现roleServiceImpl实例化的时候有如下提示:
Bean 'roleServiceImpl' of type [com.gaoxiaobo.wms.service.impl.RoleServiceImpl] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
那么问题就明了了,我们在controller层调用的roleServiceImpl对象非代理对象而是其本身,那么对其的aspect是不会生效的,不仅aspsect不会生效,事务注解@Transactional也不会生效,问题还是相当严重的。
那么,why 没有生成其代理对象呢?一定是哪里先调用了roleServiceImpl导致spring优先实例化了该bean;
通过排查,找到了罪魁祸首:shiro 的LifecycleBeanPostProcessor优先实例化自定义Realm,自定义的Realm依赖于roleService,导致roleService被初始化。
解决方法
自定义realm中roleService设置成懒加载。
Tags:
很赞哦! ()
相关文章
随机图文
-
SpringBoot排除自动配置
SpringBoot的自动配置给我们开发带来了极大的便利,但有些时候也带来了一些问题。 问题场景: 该项目是基于Springboot + dubbo的微服务架构,框架结构web + facade + service,某 -
通过Redis限制API调用次数
最近在做微信公众号返利机器人,通过曲线救国的方式拿到的淘宝客工具商权限(用别人的App Key),在服务器搭建了透传程序。 使用过程中发现一个问题:阿里妈妈对淘宝API的调用频率有限制,报错信息反馈是40次/秒。 -
【转】GPT 应用开发和思考
在过去几个月的时间中,我们似乎正处于人工智能的革命中。除了大多数人了解的 OpenAI ChatGPT 之外,许多非常新颖、有趣、实用的 AI 应用也是层出不穷,并且在使用这些应用时时,笔者也确确实实的感受到了生产力的提高。 -
mybatis plus生成实体entity没有id
总是写很多重复的增删改查毫无意义,浪费生命,于是乎准备弄一个增删改查代码生成工具。网上查了一下mybatis plus挺好的,于是乎打开官网 Quick Start!按照官网的演示栗子:// 演示