CGLIB错误将weblogic spring Web应用程序转换为springboot应用程序

时间:2017-06-21 23:32:36

标签: java spring spring-boot cglib

我正在尝试将现有的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代理的事情:

  1. 所有实现都已实现接口
  2. 在通过xml创建的bean中,添加了<aop:scoped-proxy proxy-target-class="false"/>
  3. 在通过注释创建的bean中,添加了(服务bean的示例)
  4. @Service @Scope(proxyMode = ScopedProxyMode.INTERFACE)

    但是,最后,我很困惑为什么spring可以在weblogic容器下创建bean(标记为final的类),但是在嵌入式tomcat spring-boot容器下无法创建bean。

2 个答案:

答案 0 :(得分:0)

Spring Boot默认使用基于类的代理,它不适用于final类/方法。

要禁用此功能,请将spring.aop.proxy-target-class=false添加到application.properties以启用JDK动态代理而不是基于类的代理。 (并恢复您的修改)。

注意:要让所有内容都考虑到您可能需要升级到Spring Boot 1.5.3的spring.aop.proxy-target-class作为一些最终补丁,其中包含此属性的部分错过了在以前的版本中。

有关详情,请参阅以下问题843488698887

答案 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。