【问题标题】:Upgrade to Spring Boot 1.5.4 causes NoSuchBeanDefinitionException No qualifying bean of type PlatformTransactionManager升级到 Spring Boot 1.5.4 导致 NoSuchBeanDefinitionException 没有 PlatformTransactionManager 类型的合格 bean
【发布时间】:2017-06-20 01:49:34
【问题描述】:

我目前有一个带有 Spring Boot 1.3.8 的 Java Web 应用程序,我使用 Maven + Cucumber + TestNG + 故障安全 maven 插件在构建期间运行测试。它工作正常。

当我将 Spring Boot 迁移到 1.5.4 时,运行 maven 构建以进行黄瓜测试时出现以下错误。有什么想法吗?

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.transaction.PlatformTransactionManager' available
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:353)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:340)
    at cucumber.api.spring.SpringTransactionHooks.obtainPlatformTransactionManager(SpringTransactionHooks.java:70)
    at cucumber.api.spring.SpringTransactionHooks.startTransaction(SpringTransactionHooks.java:60)
    at sun.reflect.GeneratedMethodAccessor21.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at cucumber.runtime.Utils$1.call(Utils.java:37)
    at cucumber.runtime.Timeout.timeout(Timeout.java:13)
    at cucumber.runtime.Utils.invoke(Utils.java:31)
    at cucumber.runtime.java.JavaHookDefinition.execute(JavaHookDefinition.java:60)
    at cucumber.runtime.Runtime.runHookIfTagsMatch(Runtime.java:223)
    at cucumber.runtime.Runtime.runHooks(Runtime.java:211)
    at cucumber.runtime.Runtime.runBeforeHooks(Runtime.java:201)
    at cucumber.runtime.model.CucumberScenario.run(CucumberScenario.java:40)
    at cucumber.runtime.model.CucumberFeature.run(CucumberFeature.java:165)
    at cucumber.api.testng.TestNGCucumberRunner.runCucumber(TestNGCucumberRunner.java:63)
    at cucumber.api.testng.AbstractTestNGCucumberTests.feature(AbstractTestNGCucumberTests.java:21)
    at sun.reflect.GeneratedMethodAccessor23.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:108)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:661)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:869)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1193)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:126)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
    at org.testng.TestRunner.privateRun(TestRunner.java:744)
    at org.testng.TestRunner.run(TestRunner.java:602)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:380)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:375)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
    at org.testng.SuiteRunner.run(SuiteRunner.java:289)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1301)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1226)
    at org.testng.TestNG.runSuites(TestNG.java:1144)
    at org.testng.TestNG.run(TestNG.java:1115)
    at org.apache.maven.surefire.testng.TestNGExecutor.run(TestNGExecutor.java:115)
    at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.executeSingleClass(TestNGDirectoryTestSuite.java:129)
    at org.apache.maven.surefire.testng.TestNGDirectoryTestSuite.execute(TestNGDirectoryTestSuite.java:113)
    at org.apache.maven.surefire.testng.TestNGProvider.invoke(TestNGProvider.java:111)
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)

我根据发行说明(1.4)更改了一些 Spring Boot 配置。 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.4-Release-Notes

发件人:

@WebIntegrationTest
@ContextConfiguration(classes = WebTestConfig.class, loader = SpringApplicationContextLoader.class)

收件人:

@SpringBootTest(classes = WebTestConfig.class, webEnvironment = WebEnvironment.DEFINED_PORT)

其余的都和以前一样。

Maven 插件:

<profile>
  <id>cucumber-tests</id>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <configuration>
          <includes>
            <include>**/*IT.java</include>
            <include>**/CucumberRunnerTestNG.java</include>
          </includes>
        </configuration>
      </plugin>
    </plugins>
  </build>
</profile>

黄瓜测试运行器:

@CucumberOptions(plugin = { "pretty" }, strict = true, 
     features = "src/test/features/cucumber", 
     glue = { "my.web.cucumber", "cucumber.api.spring" }, 
     monochrome = true, tags = { "~@Ignore" })
public class CucumberRunnerTestNG extends AbstractTestNGCucumberTests {
}

黄瓜基础步骤类:

package my.web.cucumber.steps;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = WebTestConfig.class, webEnvironment = WebEnvironment.DEFINED_PORT)
public abstract class BaseSteps<T> { ... }

【问题讨论】:

  • 通过遵循发行说明中提供的所有升级建议,我能够从 Spring Boot 版本 1.3.8 成功迁移到 1.5.4,但首先我必须迁移到版本 1.4.x,然后再迁移到1.5.4。一步步。 Spring Boot 中有一些棘手的变化。请务必查看发行说明中的​​所有项目。

标签: java spring maven cucumber


【解决方案1】:

你必须使用@Transactional("transactionManagerName")

见org.springframework.transaction.annotation.Transactional(@Transactional)注解javadoc:-

http://docs.spring.io/spring/docs/3.1.x/javadoc-api/org/springframework/transaction/annotation/EnableTransactionManagement.html

对于那些希望建立更直接的关系的人 @EnableTransactionManagement 和要使用的确切事务管理器 bean,可以实现 TransactionManagementConfigurer 回调接口 - 请注意下面的 implements 子句和 @Override 注释方法: 您的 @Configuration 类需要实现 TransactionManagementConfigurer 接口 - 实现 annotationDrivenTransactionManager,它将返回对应该使用的 transactionManager 的引用。

【讨论】:

  • 在使用 Spring Boot 和 @SpringBootApplication 时真的需要这样做吗?我没有使用普通的 Spring 和 XML 配置文件。默认情况下,它都是由 Spring Boot 连接的。它之前(在生产中)运行良好,升级后一切都被破坏了。这没有任何意义。
猜你喜欢
  • 2016-06-16
  • 2018-05-01
  • 2019-02-04
  • 2020-06-18
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
  • 2023-03-22
相关资源
最近更新 更多