没有为我的自定义事务管理器找到匹配的PlatformTransactionManagerbean



我有两个数据源:

spring.datasource.url=url1
spring.datasource.username=root
spring.datasource.password=sa
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver

我在mysql数据库中使用第一个用于插入/替换。

spring.second-datasource.url=url2
spring.second-datasource.username=root
spring.second-datasource.password=sa
spring.second-datasource.driverClassName=com.mysql.cj.jdbc.Driver

我使用第二个用于sphinx选择查询。

据我所知,我需要两个不同的事务管理器来处理两个数据源。

第一个数据库事务管理器:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackages = ["com.pbnhq.whois.db"],
entityManagerFactoryRef = "databaseEntityManagerFactory",
transactionManagerRef = "databaseTransactionManager"
)
class DatabaseTransactionManagerConfig {
@Primary
@Bean("databaseDataSource")
@ConfigurationProperties(prefix = "spring.datasource")
fun databaseDataSource(): DataSource {
return DataSourceBuilder.create().build()
}
@Primary
@Bean("databaseEntityManagerFactory")
fun databaseEntityManagerFactory(
builder: EntityManagerFactoryBuilder,
@Qualifier("databaseDataSource") dataSource: DataSource
): LocalContainerEntityManagerFactoryBean {
return builder
.dataSource(dataSource)
.packages("com.pbnhq.whois.db")
.persistenceUnit("database")
.build();
}
@Primary
@Bean("databaseTransactionManager")
fun databaseTransactionManager(
@Qualifier("databaseEntityManagerFactory")
firstEntityManagerFactory: EntityManagerFactory
): PlatformTransactionManager {
return JpaTransactionManager(firstEntityManagerFactory);
}
}

第二个sphinxTransactionManager:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackages = ["com.pbnhq.whois.db"],
entityManagerFactoryRef = "sphinxEntityManagerFactory",
transactionManagerRef = "sphinxTransactionManager"
)
class SphinxTransactionManagerConfig {
@Bean("sphinxDataSource")
@ConfigurationProperties(prefix = "spring.second-datasource")
fun sphinxDataSource(): DataSource {
return DataSourceBuilder.create().build()
}

@Bean("sphinxEntityManagerFactory")
fun sphinxEntityManagerFactory(
builder: EntityManagerFactoryBuilder,
@Qualifier("sphinxDataSource") dataSource: DataSource
): LocalContainerEntityManagerFactoryBean {
return builder
.dataSource(dataSource)
.packages("com.pbnhq.whois.db")
.persistenceUnit("sphinx")
.build();
}
@Bean("sphinxTransactionManager")
fun sphinxTransactionManager(
@Qualifier("sphinxEntityManagerFactory")
firstEntityManagerFactory: EntityManagerFactory
): PlatformTransactionManager {
return JpaTransactionManager(firstEntityManagerFactory);
}
}

我有存储库WhoisDB:

@Repository
interface WhoisDB : JpaRepository<WhoisDatabaseElement, Long>, CustomizedWhoisDB {
}

自定义WhoisDB

interface CustomizedWhoisDB {
fun selectFromIndex(domain: String)
}

自定义对象DBImpl

@Component
class CustomizedWhoisDBImpl : CustomizedWhoisDB {
@Transactional(transactionManager = "sphinxTransactionManager")
@Query("SELECT FROM whois WHERE MATCH('domain')")
override fun selectFromIndex(@Param("domain") domain: String) {
}
}

我想测试我的选择查询。我有测试:

@RunWith(SpringRunner::class)
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class SphinxTest {
@Autowired
private lateinit var repo: WhoisDB
@Test
@Transactional(transactionManager = "sphinxTransactionManager")
fun select() {
val result = repo.selectFromIndex("example.com")
}
}

但目前我得到这个错误

No bean named 'sphinxTransactionManager' available: No matching PlatformTransactionManager bean found for qualifier 'sphinxTransactionManager' - neither qualifier match nor bean name match!
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'sphinxTransactionManager' available: No matching PlatformTransactionManager bean found for qualifier 'sphinxTransactionManager' - neither qualifier match nor bean name match!
at org.springframework.beans.factory.annotation.BeanFactoryAnnotationUtils.qualifiedBeanOfType(BeanFactoryAnnotationUtils.java:136)
at org.springframework.beans.factory.annotation.BeanFactoryAnnotationUtils.qualifiedBeanOfType(BeanFactoryAnnotationUtils.java:95)
at org.springframework.test.context.transaction.TransactionalTestExecutionListener.getTransactionManager(TransactionalTestExecutionListener.java:332)
at org.springframework.test.context.transaction.TransactionalTestExecutionListener.beforeTestMethod(TransactionalTestExecutionListener.java:198)
at org.springframework.test.context.TestContextManager.beforeTestMethod(TestContextManager.java:289)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
at org.junit.vintage.engine.execution.RunnerExecutor.execute(RunnerExecutor.java:40)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
at org.junit.vintage.engine.VintageTestEngine.executeAllChildren(VintageTestEngine.java:80)
at org.junit.vintage.engine.VintageTestEngine.execute(VintageTestEngine.java:71)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:220)
at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:188)
at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:202)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:181)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.processAllTestClasses(JUnitPlatformTestClassProcessor.java:102)
at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor$CollectAllTestClassesExecutor.access$000(JUnitPlatformTestClassProcessor.java:82)
at org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestClassProcessor.stop(JUnitPlatformTestClassProcessor.java:78)
at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.stop(SuiteTestClassProcessor.java:61)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:32)
at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
at com.sun.proxy.$Proxy2.stop(Unknown Source)
at org.gradle.api.internal.tasks.testing.worker.TestWorker.stop(TestWorker.java:132)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:35)
at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:175)
at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:157)
at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:404)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
at java.base/java.lang.Thread.run(Thread.java:834)

我对这些技术很陌生。我做错了什么?

我使用了这本手册,并试图将我的项目的一部分添加到其中。成功后,我在我的项目中重复了它,它就开始工作了。我认为其中一个问题是通往实体元素的错误路径。我需要添加这个选项:

spring.main.allow-bean-definition-overriding=true

相关内容

  • 没有找到相关文章

最新更新