not eligible for getting processed by all BeanPostProcessors
描述
这个BUG大的起源是我上线以后,在后台看日志的时候发现一行奇怪的INFO日志:
2022-06-09 23:34:24 [restartedMain] [org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker:376] INFO - Bean 'userServiceImpl' of type [com.markerhub.service.impl.UserServiceImpl] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
什么?userServiceImpl代理失效了?我于是尝试了一下,果然,这个方法直接不回滚了:
@Override
@Transactional
public void addUser(UserVo user) {
User userExist = getBaseMapper().selectOne(new QueryWrapper<User>().eq("id", user.getId()));
if (userExist == null) {//添加
user.setPassword(SecureUtil.md5(user.getPassword()));
user.setCreated(LocalDateTime.now());
user.setLastLogin(LocalDateTime.now());
boolean update = saveOrUpdate(user);
log.info("添加{}号账号结果:{}", user.getId(), update);
int i = 1 / 0;
Assert.isTrue(update, "添加失败");
} else {//修改
BeanUtil.copyProperties(user, userExist, "created", "password", "lastLogin", "username", "id");
boolean update = saveOrUpdate(userExist);
log.info("修改{}号账号结果:{}", userExist.getId(), update);
Assert.isTrue(update, "修改失败");
}
}
第12行我强行模拟了故障,但是数据库里还是保存成功了。这个是生产上的严重事故。Spring事务默认的传播级别,是当前若存在事务,就加入这个事务。saveOrUpdate是mybatis-plus的方法,已经加上了事务注解,也就是说这里事务本来必须是其作用的。
原理探究
我从网上的一篇文章发现了答案https://blog.csdn.net/feiying0canglang/article/details/119704109,问题的罪魁祸首是Shiro框架。
在使用shiro框架的时候,一般都要新建一个ShiroFilterFactoryBean配置一些配置,例如:
@Bean("shiroFilterFactoryBean")
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager,
ShiroFilterChainDefinition shiroFilterChainDefinition) {
ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
shiroFilter.setSecurityManager(securityManager);
Map<String, Filter> filters = new HashMap<>();
filters.put("jwt", jwtFilter);
shiroFilter.setFilters(filters);
Map<String, String> filterMap = shiroFilterChainDefinition.getFilterChainMap();
shiroFilter.setFilterChainDefinitionMap(filterMap);
return shiroFilter;
}
这些本身是一些固定的写法,没有太多可以改的,抄过来就行了。但是问题在于ShiroFilterFactoryBean实现了BeanPostProcessor这个接口:
public class ShiroFilterFactoryBean implements FactoryBean<AbstractShiroFilter>, BeanPostProcessor;
这个接口的实现类会在某种情况下被提前初始化,导致他不会被Sping AOP的动态代理所处理,最后的结果就是事务失效。
从打印日志看到,Realm是没有被代理的,因为Realm依赖了UserService,最后UserService页没有被代理。UserService也可能依赖了其他Service,最后就全都事务失效了。
解决
在UserService上加入@Lazy懒加载模式:
UserService userService;
@Autowired
@Lazy
private void setUserServiceImpl(UserService userService) {
this.userService = userService;
}
分析依赖,将提前加载的Service全部懒加载。
not eligible for getting processed by all BeanPostProcessors的更多相关文章
- is not eligible for getting processed by all BeanPostProcessors
BeanPostProcessor是控制Bean初始化开始和初始化结束的接口.换句话说实现BeanPostProcessor的bean会在其他bean初始化之前完成,BeanPostProcessor ...
- is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
出现此日志的原因: https://blog.csdn.net/m0_37962779/article/details/78605478 上面的博客中可能解决了他的问题,可我的项目是spring bo ...
- BeanPostProcessors (for example: not eligible for auto-proxying),报错解决
最近遇到个问题,springmvc项目debug启动失败 debug启动会卡住不动,run模式启动正常 debug启动输出到下面这行之后,就不会继续输出了 -- :: [INFO]- Bean 'da ...
- idea-debug启动会卡住不动,BeanPostProcessors (for example: not eligible for auto-proxying),报错解决
debug启动会卡住不动,run模式启动正常 debug启动输出到下面这行之后,就不会继续输出了 爆出各种 [INFO]- Bean 'dataSource' of type [class Druid ...
- spring boot 代理(not eligible for auto-proxying)
spring 事务机制网上的案例很多,关于事务 不能回滚也有很多的类型,不同的问题有不同的处理方案,本篇博客主要介绍两种事务不能回滚的问题解决方案: 问题一: 在同一个对象中有两个方法,分别未方 ...
- Dubbo消费端错误: ClassNotFoundException: org.apache.zookeeper.proto.WatcherEvent
出现错误的原因是消费端war没有启动成功, 但是zkClient和Dubbo的对应Thread启动了, web container无法加载对应的类, INFO: Initializing Protoc ...
- Spring Autowired错误???
@SpringBootApplicationpublic class TestMqApplication extends SpringBootServletInitializer { @Suppres ...
- spring-boot支持双数据源mysql+mongo
这里,首先想说的是,现在的web应用,处理的数据对象,有结构化的,也有非结构化的.同时存在.但是在spring-boot操作数据库的时候,若是在properties文件中配置数据源的信息,通过默认配置 ...
- Spring boot配合Spring session(redis)遇到的错误
背景:本MUEAS项目,一开始的时候,是没有引入redis的,考虑到后期性能的问题而引入.之前没有引用redis的时候,用户登录是正常的.但是,在加入redis支持后,登录就出错!错误如下: . __ ...
- Logback相关知识汇总
例如:%-4relative 表示,将输出从程序启动到创建日志记录的时间 进行左对齐 且最小宽度为4格式修饰符,与转换符共同使用:可选的格式修饰符位于“%”和转换符之间.第一个可选修饰符是左对齐 标志 ...
随机推荐
- flutter Slivers
一. Slivers 我们考虑一个这样的布局:一个滑动的视图中包括一个标题视图(HeaderView),一个列表视图(ListView),一个网格视图(GridView). 我们怎么可以让它们做到统一 ...
- Java包机制 与Javados 命令
package: 定义包 import : 导入包 com.wang.test.* :点* 是导入当前包下的所有类 @author :注释作者名 @version :注释版本号 @since ...
- Qt 按键添加图标
1.开发环境:Qt5.12.2,QtCreate4.8.2 2.直接上代码 /* 按键上背景 */ QPixmap pixmap(":/Resourses/images/easyicon_n ...
- 在wsl 2中编译自己的魔趣(mokee) ROM
1.安装wsl2 a.在windows 10 系统中启用wsl2(只能是wsl2,wsl1 会编译失败), 并商店中下载ubuntu镜像,商店默认安装位置为C:\Program Files\Windo ...
- 日常开发记录-Object函数的内置方法Object.entries
方法1: const data = { id: 1, name: "张三", age: 22 } let params = "" /* Object.entri ...
- BIP弹框内容显示的隐藏
viewModel.on("customInit", function (data) { // 关闭或取消关原因详情--页面初始化 viewMode ...
- (转载)Overlay网络
1. Overlay 网络1.1 Overlay 技术概述 Overlay 在网络技术领域,指的是一种网络架构上叠加的虚拟化技术模式,其大体框架是对基础网络不进行大规模修改的条件下,实现应用在网 ...
- 蓝桥杯训练赛二-2021 问题 G: 坐标排序
题目描述 请将坐标x,y,z依照以下规则排序: x为第一关键字,当x相同时,依照y(第二关键字)大小来排序,当y相同时,依照z大小来排序(第三关键字) 给出了若干坐标,和一个数k,请输出按关键字排序第 ...
- 输入流导致javax.crypto.BadPaddingException
使用FileInputStream一切正常,切换为使用classpath从jar包读取getResourceAsStream一直报如下错误 javax.crypto.BadPaddingExcepti ...
- GrADS CTL文件 VARS字段
GrADS可以读取GRIB格式的再分析数据,如ERA5,CFSR,CRA40等.对于这些数据,借助grib2ctl/g2ctl程序,生成描述文件(*.ctl文件),再通过gribmap命令,生成索引文 ...