背景

两个代码分支A、B,AB单独都能正常启动。
其中B分支进行了日志相关的改造,其中有一个点改动是 <aop:aspectj-autoproxy proxy-target-class=“true” />,限制了代理生成方式只能是cglib。
其中A分支是正常的业务开发,没有进行代理相关的改动。
当A分支merge到B分支时,启动发生异常:

[ERROR][2020/08/27 09:06:31.048][RMI TCP Connection(3)-127.0.0.1][sequenceid:] Context initialization failed [org.springframework.web.context.ContextLoader]java.lang.IllegalArgumentException: Cannot subclass final class class com.sun.proxy.$Proxy94at org.springframework.cglib.proxy.Enhancer.generateClass(Enhancer.java:446)at org.springframework.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33)at org.springframework.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
Wrapped by: org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.sun.proxy.$Proxy94]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class class com.sun.proxy.$Proxy94at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:212)at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:109)at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:447)
Wrapped by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dwsbfRcgzsbTzmxRepository': Post-processing of FactoryBean's singleton object failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class com.sun.proxy.$Proxy94]: Common causes of this problem include using a final class or a non-visible class; nested exception is java.lang.IllegalArgumentException: Cannot subclass final class class com.sun.proxy.$Proxy94at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:116)at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1514)at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:250)

问题分析

从打印的异常堆栈看,它的意思是无法继承final的类,无法创建dwsbfRcgzsbTzmxRepository。
首先可以理解的是,interface接口是final修饰的,因为接口是无法被继承的。而B分支做了 <aop:aspectj-autoproxy proxy-target-class=“true” />修改,创建代理只能通过继承实现,所以报错了。

可是,这个repository接口为什么需要创建代理呢?

问题发现

原来同事在接口方法上加了@Transactional注解,我们知道,spring 的事务是通过aop实现的,需要创建代理,而<aop:aspectj-autoproxy proxy-target-class=“true” />限制了只能通过cglib创建代理,所以就报错了。而在A分支没有报错的原因就是因为这里可以采用JDK动态代理实现,是没有问题的

问题解决

将 @Transactional注解移到service层,改为对service实体类创建cglib代理就通过了。

Cannot subclass final class class com.sun.proxy.$Proxy94相关推荐

  1. Cannot subclass final class class com.sun.proxy.$Proxy16

    Cannot subclass final class class com.sun.proxy.$Proxy16 2016年05月04日 19:10:58 阅读数:15028 背景 这个错误是我在使用 ...

  2. Cannot subclass final class org.springframework.boot.autoconfigure.AutoConfigurationPackages

    自己写aop例子时遇到报错如下: Exception in thread "main" org.springframework.beans.factory.BeanCreation ...

  3. AOP 注入失败的问题

    启用了AOP 后,报这样的类似错误: Error creating bean with name 'bpmpSysUserService': Injection of autowired depend ...

  4. 关于异常:警告: Exception encountered during context initialization - cancelling refresh attempt

    警告: Exception encountered during context initialization - cancelling refresh attempt: org.springfram ...

  5. Spring AOP 概念及动态代理模式

    Spring AOP 概念及动态代理模式 文章目录 Spring AOP 概念及动态代理模式 1 AOP 的概念及相关术语 2 AOP 作用 3 AOP 原理概述 3.1 JDK 动态代理(Proxy ...

  6. 深入理解Java Proxy和CGLIB动态代理原理

    点击上方关注,每天进步一点点 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译 ...

  7. 用java怎么实现数据库_用Java实现数据库应用系统

    package skydev.modules.data; public final class SqlServerConnectionFactory extends ConnectionFactory ...

  8. Java Proxy和CGLIB动态代理原理

    动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译时就确定了,而动态代理的代理关 ...

  9. Sharding-JDBC(二)2.0.3版本实践

    目录 一.Sharding-JDBC依赖 二.分片策略 1. 标准分片策略 2. 复合分片策略 3. Inline表达式分片策略 4. 通过Hint而非SQL解析的方式分片的策略 5. 不分片的策略 ...

最新文章

  1. 30分钟入门Java8之默认方法和静态接口方法
  2. 如何让Android对话框全屏 Dialog 全屏
  3. li在python中啥意思_Python中*和**的区别
  4. 我用 PyTorch 复现了 LeNet-5 神经网络(CIFAR10 数据集篇)!
  5. 算法录 之 复杂度分析。
  6. P5327 [ZJOI2019]语言
  7. 作者:王玲玲(1978-),女,中国科学院上海天文台高级工程师
  8. javascript设计模式-singleton(单例)模式
  9. mysql查询php输出表格_MySql数据库查询结果用表格输出PHP代码示例_PHP教程
  10. 那么问题来了,什么才是正确的?我们就是为问题而生的
  11. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_05-freemarker基础-List指令
  12. 简单有效的记录日常收支
  13. Unity 模拟鼠标点击
  14. 网站死链接检测与完美处理方法
  15. 阿里飞天云平台架构简介
  16. Flash Player 更新后视频卡问题
  17. 判断是否微信打开实现跳转
  18. rust 入门笔记: rustlings(推荐一些学习rust语法的一些非常好的小练习)
  19. 七夕祭( Poetize系列)
  20. 【数据结构】8. 队列(带头节点的单链表实现)(完整代码实现:初始化、入队列、出队列、获取队头元素、获取队尾元素、获取队列中有效元素的个数、判空、销毁)

热门文章

  1. 路由器ACL(访问控制列表)详解
  2. 5G注册流程分级详解Step4-8
  3. Oracle EBS 后台提交请求集 FND_SUBMIT.SUBMIT_PROGRAM
  4. IAR使用方法建立工程文件超详细操作步骤
  5. 前端console.log打印内容与后端请求返回数据不一致
  6. 如何下载在线视频:流行视频FLV下载
  7. GeoServer中的WPS服务-概念
  8. 给我写信 wyz831201王玉镇
  9. eureka集群只注册一个_闲聊注册中心——ZK、Eureka、Sofa-Registry
  10. 添加额外jars包到Hive