Spring Cloud Eureka Client pom依赖的问题?

我创建了一个eureka客户端,依赖如下:

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>
    </dependencies>

入口来启动报错,报错如下:

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

Description:

Field optionalArgs in org.springframework.cloud.netflix.eureka.
EurekaClientAutoConfiguration$RefreshableEurekaClientConfiguration 
required a bean of type 'com.netflix.discovery.
AbstractDiscoveryClientOptionalArgs' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

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


Process finished with exit code 1

我知道加上如下依赖可以解决

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
</dependency>

我就在思考这个问题的原因是什么?按照报错信息来看,是因为没有注入AbstractDiscoveryClientOptionalArgs这个对象,那是因为添加上web依赖后注解生效了,找到了这个对象?
就想问一下,这个原因是什么,为什么会报错?以及解决这个问题的原理。

阅读 3.1k
1 个回答

在类 DiscoveryClientOptionalArgsConfiguration 中,生成需要的 AbstractDiscoveryClientOptionalArgs 类型 bean。

AbstractDiscoveryClientOptionalArgs 的扩展类 RestTemplateDiscoveryClientOptionalArgs(其它扩展类不符合要求) 需要 RestTemplate

RestTemplatespring-web 提供,spring-web 的依赖被 spring-boot-starter-web 提供。

我的疑惑
这是我通过 github 上最新的源码查到的,但是我添加了你的依赖版本 1.4.7.RELEASE,发现 DiscoveryClientOptionalArgsConfiguration 的源码并没有这样的问题。

    @Bean
    @ConditionalOnMissingClass("com.sun.jersey.api.client.filter.ClientFilter")
    @ConditionalOnMissingBean(value = AbstractDiscoveryClientOptionalArgs.class, search = SearchStrategy.CURRENT)
    public RestTemplateDiscoveryClientOptionalArgs restTemplateDiscoveryClientOptionalArgs() {
        return new RestTemplateDiscoveryClientOptionalArgs();
    }

下面是最新的源码

    @Bean
    @ConditionalOnClass(name = "org.springframework.web.client.RestTemplate")
    @ConditionalOnMissingClass("com.sun.jersey.api.client.filter.ClientFilter")
    @ConditionalOnMissingBean(value = { AbstractDiscoveryClientOptionalArgs.class }, search = SearchStrategy.CURRENT)
    @ConditionalOnProperty(prefix = "eureka.client", name = "webclient.enabled", matchIfMissing = true,
            havingValue = "false")
    public RestTemplateDiscoveryClientOptionalArgs restTemplateDiscoveryClientOptionalArgs(TlsProperties tlsProperties,
            EurekaClientHttpRequestFactorySupplier eurekaClientHttpRequestFactorySupplier)
            throws GeneralSecurityException, IOException {
        logger.info("Eureka HTTP Client uses RestTemplate.");
        RestTemplateDiscoveryClientOptionalArgs result = new RestTemplateDiscoveryClientOptionalArgs(
                eurekaClientHttpRequestFactorySupplier);
        setupTLS(result, tlsProperties);
        return result;
    }

能否贴一下你的 DiscoveryClientOptionalArgsConfiguration 内容?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题