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依赖后注解生效了,找到了这个对象?就想问一下,这个原因是什么,为什么会报错?以及解决这个问题的原理。
回复
1个回答

test
2024-07-18
在类 DiscoveryClientOptionalArgsConfiguration
中,生成需要的 AbstractDiscoveryClientOptionalArgs
类型 bean。
AbstractDiscoveryClientOptionalArgs
的扩展类 RestTemplateDiscoveryClientOptionalArgs
(其它扩展类不符合要求) 需要 RestTemplate
。
RestTemplate
被 spring-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
内容?
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容