Java 将weblogic spring web应用程序转换为springboot应用程序时出现CGLIB错误
我正在尝试将现有的SpringWebLogic应用程序转换为SpringBoot嵌入式tomcat应用程序 有很多运动部件,所以很难显示任何代码,我希望有一些一般性的答案,可能会提示我的问题 在weblogic下,使用SpringFramework4.3.6.RELEASE库,应用程序可以很好地部署。创建不同的服务、存储库和组件bean没有问题 但是,当我将其迁移到Spring Boot 1.5.1.RELEASE时,我得到以下错误:Java 将weblogic spring web应用程序转换为springboot应用程序时出现CGLIB错误,java,spring,spring-boot,cglib,Java,Spring,Spring Boot,Cglib,我正在尝试将现有的SpringWebLogic应用程序转换为SpringBoot嵌入式tomcat应用程序 有很多运动部件,所以很难显示任何代码,我希望有一些一般性的答案,可能会提示我的问题 在weblogic下,使用SpringFramework4.3.6.RELEASE库,应用程序可以很好地部署。创建不同的服务、存储库和组件bean没有问题 但是,当我将其迁移到Spring Boot 1.5.1.RELEASE时,我得到以下错误: 2017-06-21 17:08:16,402 [ERROR
2017-06-21 17:08:16,402 [ERROR] SpringApplication reportFailure (815) - Application startup failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'alertEventServiceImpl': Unsatisfied dependency expressed through field 'alertEventDao'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'alertEventDaoImpl' defined in URL [jar:file:/Users/username/Development/source/carma-war/target/carma-war-2.0.0-SNAPSHOT.war!/WEB-INF/lib/protocol-manager-1.8.0-SNAPSHOT.jar!/org/ihc/hwcir/protocol/dao/AlertEventDaoImpl.class]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Could not generate CGLIB subclass of class [class org.ihc.hwcir.protocol.dao.AlertEventDaoImpl]: 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 org.ihc.hwcir.protocol.dao.AlertEventDaoImpl
我们的许多服务类别都是最终的,因为它们不应该扩展。因为有太多的是最终版本,所以我想尽量减少我们不同库中的代码量,我们可以修改这些代码来实现这一点
我认为因为bean创建过程在weblogic下工作,所以它应该在spring引导下工作
我试图强制不使用cglib代理的事情:
@服务
@作用域(proxyMode=ScopedProxyMode.INTERFACE)
然而,最后,我很困惑为什么spring可以在weblogic容器下创建bean(标记为final的类),但不能在嵌入式tomcat spring引导容器下创建bean。spring引导默认使用基于类的代理,这将不适用于
final
类/方法
要禁用此功能,请将spring.aop.proxy target class=false
添加到application.properties
以启用JDK动态代理,而不是基于类的代理。(并恢复您的修改)
注意:要使所有内容都考虑到spring.aop.proxy目标类
,您可能需要升级到spring Boot 1.5.3,作为一些最终补丁,在以前版本中丢失的部分中包含此属性
有关更多信息,请参阅以下问题。我无法使用M.Deinums使用spring.aop.proxy target class=false给出的答案来完成这项工作 对我有效的方法是在application.properties文件中添加
spring.dao.exceptiontranslation.enabled=false
请注意,此选项禁用存储库的代理创建
在我的spring boot应用程序中,将注释配置为在不使用代理类的情况下处理事务
@EnableTransactionManagement(proxyTargetClass = false)
这是使用Spring Boot版本1.5.1.RELEASE。在web逻辑容器中,它不使用CGLIB,而是使用基于接口的JDK动态代理。SpringBoot强制类代理和禁用,您需要修改配置。此外,您没有使用作用域代理,因此将to属性设置为false不会产生任何影响。您必须更改事务处理,覆盖JPA设置的一些配置等,以拥有基于接口的代理。请参阅示例问题。对于Spring Boot 1.5,您应该在
应用程序中设置Spring.aop.proxy target class=false
。properties
,这样您就可以开始了。默认值为true
。不幸的是,这样做不起作用。使它工作的是这个设置,不知道为什么。spring.dao.exceptiontranslation.enabled=false。。。你知道吗?然而,您与事务管理器打交道的另一个问题的链接是正确的。我很高兴接受这个答案,如果你添加链接,让我理解为什么exceptiontranslation.enabled=false而不是aop.proxy-target-class起作用。这基本上禁用了存储库的异常转换,因此需要为存储库创建代理。我建议您自己配置PersistenceExceptionTranslationPostProcessor
并将proxyTargetClass
属性设置为false,而不是禁用它。(除了spring.aop.proxy target class=true
。这基本上禁用了存储库的异常转换,因此不需要为存储库创建代理。我建议您自己配置PersistenceExceptionTranslationPostProcessor
,并将proxyTargetClass属性设置为false。(除了spring.aop.proxy target class=false
)。PersistenceExceptionTranslationAutoConfiguration
考虑了这个属性,奇怪得无法工作。(啊,这是在spring Boot 1.5.3中添加的,所以你可能想升级到最新的1.5.x版本,而不是禁用它)。