我正在尝试将现有的spring weblogic应用程序转换为Spring boot嵌入式tomcat应用程序。
有许多活动部分,因此很难显示任何代码,我希望有一些一般性的答案可能会让我知道这个问题。
在weblogic下,使用spring-framework 4.3.6.RELEASE库,应用程序可以正常部署。创建不同的服务,存储库和组件bean没有问题。
但是,当我将它迁移到Spring Boot 1.5.1.RELEASE时,我收到以下错误:
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 boot下工作。
我试图强制不使用cglib代理的事情:
<aop:scoped-proxy proxy-target-class="false"/>
@Service
@Scope(proxyMode = ScopedProxyMode.INTERFACE)
但是,最后,我很困惑为什么spring可以在weblogic容器下创建bean(标记为final的类),但是在嵌入式tomcat spring-boot容器下无法创建bean。
答案 0 :(得分:0)
Spring Boot默认使用基于类的代理,它不适用于final
类/方法。
要禁用此功能,请将spring.aop.proxy-target-class=false
添加到application.properties
以启用JDK动态代理而不是基于类的代理。 (并恢复您的修改)。
注意:要让所有内容都考虑到您可能需要升级到Spring Boot 1.5.3的spring.aop.proxy-target-class
作为一些最终补丁,其中包含此属性的部分错过了在以前的版本中。
答案 1 :(得分:0)
使用Spring.aop.proxy-target-class = false,我无法使用M. Deinums的回答来完成这项工作。
对我有用的是添加application.properties文件
spring.dao.exceptiontranslation.enabled=false
请注意,此选项会禁用存储库的代理创建。
在我的spring boot应用程序中,配置注释以在不使用代理类的情况下处理事务。
@EnableTransactionManagement(proxyTargetClass = false)
这是使用Spring Boot版本1.5.1.RELEASE。