Spring Boot:ReactiveCrudRepository 没有被任何 bean 实现

Posted

技术标签:

【中文标题】Spring Boot:ReactiveCrudRepository 没有被任何 bean 实现【英文标题】:Spring Boot: ReactiveCrudRepository is not being implemented by any bean 【发布时间】:2018-05-28 22:54:25 【问题描述】:

我计划使用 Cassandra 响应式地保存数据。为此,我编写了以下界面:

@Repository
public interface ContributorStatRepository extends ReactiveCrudRepository<ContributorStat, Long> 
    Flux<ContributorStat> findByAkonId(String akonId);

上面的异常被抛出:

com.example.sample.controller.ContributorStatControllerTest > shouldReturnBadRequestWithBlankContributorStat FAILED
    java.lang.IllegalStateException
        Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException
            Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException
                Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException

你知道为什么没有为ContributorStatRepository 创建合适的bean吗?

我正在使用 Spring boot 2.0.0.M7 和这些依赖项:

dependencies 
    compile('org.springframework.boot:spring-boot-starter-actuator')
    compile('org.springframework.boot:spring-boot-starter-data-jpa')
    compile('javax.xml.bind:jaxb-api:2.3.0')
    compile('org.springframework.boot:spring-boot-starter-webflux')
    compile('org.springframework.boot:spring-boot-starter-data-cassandra-reactive')
    testCompile('org.springframework.boot:spring-boot-starter-test')
    testCompile('io.projectreactor:reactor-test')

更新: 运行测试:

@Test
public void shouldReturnBadRequestWithBlankContributorStat() throws Exception 
    requestPayload = mapper.writeValueAsString(new ContributorStatDTO());

    this.mockMvc.perform(post(CONTRIBUTOR_STATS_ROUTE)
            .contentType(MediaType.APPLICATION_JSON)
            .accept(MediaType.APPLICATION_JSON)
            .content(requestPayload)).andDo(print())
            .andExpect(status().isBadRequest());

【问题讨论】:

您能提供更多信息吗?您的存储库接口看起来很奇怪(声明了两倍的扩展接口?)并且您没有显示您正在运行的测试类。另外,为什么要在组合中添加 spring-data-jpa? @BrianClozel 哦,我忘了删除注释行。刚刚更新了。感谢您的观察。包含 spring-data-jpa 以创建另一个非反应性存储库。我包含了测试,但实际上所有测试都失败了,因为没有找到该存储库的 bean。 @Jovanny 你有没有在任何地方添加@Enable*Repositories?例如。喜欢this example? @Brian,是的,我有一个标记为@Configuration@EnableReactiveCassandraRepositories 的配置类 【参考方案1】:

您似乎正在使用 @WebMvcTest 带注释的类来测试此案例(不过我不确定,您的问题中缺少该部分)。

要测试 Spring WebFlux 应用程序,您应该使用@WebFluxTest(请参阅reference documentation)。即使你这样做了,ContributorStatRepository bean 也不会存在,因为 web 测试切片只会考虑你应用程序的 web 部分,你通常需要用 @MockBean 模拟这个。

【讨论】:

以上是关于Spring Boot:ReactiveCrudRepository 没有被任何 bean 实现的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Spring Boot 应用程序 pom 同时需要 spring-boot-starter-parent 和 spring-boot-starter-web?

《02.Spring Boot连载:Spring Boot实战.Spring Boot核心原理剖析》

spring-boot-quartz, 依赖spring-boot-parent

spring-boot系列:初试spring-boot

Spring Boot:Spring Boot启动原理分析

Spring Boot:Spring Boot启动原理分析