【问题标题】:Spring Boot 1.5 @JdbcTest failing when using Eureka DiscoverySpring Boot 1.5 @JdbcTest 在使用 Eureka Discovery 时失败
【发布时间】:2017-05-25 02:37:08
【问题描述】:

我正在尝试在 Spring boot 1.5.0.RC1 中使用新的 @JdbcTest 注释。

我的应用程序使用 Eureka 发现,即我有

compile('org.springframework.cloud:spring-cloud-starter-eureka')

在我的 build.gradle 和

@EnableDiscoveryClient

在我的主要 Spring Boot 类中

当我尝试使用 @JdbcTest 测试基于 JdbcTemplate 的 DAO 时,我收到此错误:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method eurekaHealthIndicator in org.springframework.cloud.netflix.eureka.EurekaDiscoveryClientConfiguration$EurekaHealthIndicatorConfiguration required a bean of type 'com.netflix.discovery.EurekaClient' that could not be found.


Action:

Consider defining a bean of type 'com.netflix.discovery.EurekaClient' in your configuration.

看起来自动配置正在加载 Eureka 配置的一部分,而它应该只加载与 JDBC 相关的 bean。

如果我添加

@TestPropertySource(properties={"eureka.client.enabled=false"})

测试问题消失了,但我认为@JdbcTest 应该已经确保只加载了相关的bean。

我是否遗漏了什么,或者这是新的@JdbcTest 或 Spring Cloud Eureka 的问题?

【问题讨论】:

  • 尝试将这些选项添加到您的测试道具中:eureka.client.register-with-eureka=falseeureka.client.fetch-registry=falseendpoints.health.enabled=false
  • 正如我所说,当我添加 eureka.client.enabled=false 时它会起作用。但是@JdbcTest 的想法是它只关心应用程序的 JDBC 层。我不应该开始弄清楚我的整个应用程序中的哪些额外依赖项会导致问题以及如何关闭它们。

标签: spring-boot spring-cloud-netflix


【解决方案1】:

您的@SpringBootApplication 上有@ EnableDiscoveryClient。当您使用切片注释(例如@JdbcTest)时,Spring Boot 通过查看测试包中的@SpringBootConfiguration 来查找要使用的上下文。如果它没有找到,它会在父包中查找,等等。有了一个合理的包结构并且没有进一步的定制,你的测试使用你的 @SpringBootApplication 作为根上下文。

所以,那个配置类(而且只有那个)被处理了,@EnableDiscoveryClient 显然也被处理了。在您的情况下,这有一个额外的副作用:现在每个测试都需要 Eureka 客户端。

TL;DR 永远不要在你的应用程序上添加这样的注释。并且仅在您确实需要时才放置它。您可以在 Spring Boot 应用程序旁边为这些定义一个 @Configuration 类。

【讨论】:

  • "永远不要在你的应用程序上添加这样的注释" - 这对我来说是新的,大多数例子似乎都是这样做的,包括 spring.io/guides/gs/service-registration-and-discoverycloud.spring.io/spring-cloud-netflix 的“快速入门”,所以我不是确定你为什么不应该这样做(除非我需要,否则我不会有注释!)。我想我可以移动注释,但似乎真的要移动你的核心配置以适应测试切片功能的实现?
  • 我在切片的上下文中告诉过你。如果您不希望您的测试使用您的应用程序作为源,请创建一个专用的@SpringBootConfiguration。试着退后一步,你不能两全其美。
【解决方案2】:

@大卫 我有类似的问题,并通过将以下内容添加到我的 application.yml 文件来解决

eureka:
  client:
    enabled: false

【讨论】:

    猜你喜欢
    • 2017-01-01
    • 2021-11-30
    • 1970-01-01
    • 2022-01-26
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 2017-07-09
    • 2021-04-16
    相关资源
    最近更新 更多