2017-06-19 138 views
0

目前我和春天有引導1.3.8 Java Web應用程序,我使用Maven +黃瓜+ TestNG的故障安全+ Maven插件運行在構建時測試。它工作正常。升級到春季啓動1.5.4原因NoSuchBeanDefinitionException無型的排位豆的PlatformTransactionManager

當我春天引導遷移到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 = { "[email protected]" }) 
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> { ... } 
+0

我能夠按照所有的發行說明中提供的升級建議,成功地從春天啓動版本1.3.8遷移到1.5.4,但首先我必須遷移到1.4.x版,然後到1.5.4。一步步。 Spring Boot中有一些棘手的變化。確保您查看發行說明中的​​所有項目。 – danieldestro

回答

0

,你必須使用@Transactional("transactionManagerName")

參看O rg.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子句和下面的@覆蓋標註方法: 你@Configuration類需要實現TransactionManagementConfigurer接口 - 實現,這將參考返回到要使用的transactionManager的的annotationDrivenTransactionManager。

+0

是使用Spring引導和@SpringBootApplication當這真的需要?我沒有使用普通的Spring和XML配置文件。它由Spring Boot默認連線。據之前(生產),並與升級所有壞了的工作不錯。這沒有任何意義。 – danieldestro