spring-cloud-starter-ribbon 缺少 HTTP 客户端依赖项
Missing HTTP client dependencies for spring-cloud-starter-ribbon
我有一个简单的 Spring 引导应用程序,它有一个简单的 REST 客户端,看起来像这样:
@Service
public class MyRestClient {
private static final String url = "http://localhost:8080/";
private RestTemplate restTemplate;
@Autowired
public MyRestClient(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
public String invoke() {
return restTemplate.getForObject(url, String.class);
}
}
这与 Spring Boot 完美配合。
现在我正尝试将 Spring Cloud
添加到项目中以实现功能区客户端负载平衡。我点击了这里的链接:
https://spring.io/guides/gs/client-side-load-balancing/
或这里的这个,它似乎是复制和粘贴但具有更多更新的依赖项:
http://www.baeldung.com/spring-cloud-rest-client-with-netflix-ribbon
即使不向 MyRestClient
添加任何注释,我添加以下内容的那一刻:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.3.4.RELEASE</version>
</dependency>
我得到以下异常:
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.client.RestTemplate]: Factory method 'restTemplate' threw exception; nested exception is java.lang.NoClassDefFoundError: org/apache/http/impl/client/HttpClients
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) ~[spring-beans-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) ~[spring-beans-4.3.11.RELEASE.jar:4.3.11.RELEASE]
... 31 common frames omitted
Caused by: java.lang.NoClassDefFoundError: org/apache/http/impl/client/HttpClients
at org.springframework.http.client.HttpComponentsClientHttpRequestFactory.<init>(HttpComponentsClientHttpRequestFactory.java:88) ~[spring-web-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_131]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_131]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_131]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_131]
at java.lang.Class.newInstance(Class.java:442) ~[na:1.8.0_131]
at org.springframework.beans.BeanUtils.instantiate(BeanUtils.java:77) ~[spring-beans-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.springframework.boot.web.client.RestTemplateBuilder.detectRequestFactory(RestTemplateBuilder.java:596) ~[spring-boot-1.5.7.RELEASE.jar:1.5.7.RELEASE]
at org.springframework.boot.web.client.RestTemplateBuilder.configureRequestFactory(RestTemplateBuilder.java:559) ~[spring-boot-1.5.7.RELEASE.jar:1.5.7.RELEASE]
at org.springframework.boot.web.client.RestTemplateBuilder.configure(RestTemplateBuilder.java:527) ~[spring-boot-1.5.7.RELEASE.jar:1.5.7.RELEASE]
at org.springframework.boot.web.client.RestTemplateBuilder.build(RestTemplateBuilder.java:515) ~[spring-boot-1.5.7.RELEASE.jar:1.5.7.RELEASE]
at org.springframework.boot.web.client.RestTemplateBuilder.build(RestTemplateBuilder.java:501) ~[spring-boot-1.5.7.RELEASE.jar:1.5.7.RELEASE]
为什么我的 REST 客户端在没有此依赖项的情况下工作,但没有添加任何注释或任何东西,当我添加此依赖项时,我得到此异常?
我尝试从文档或示例中添加各种依赖项,例如 spring-cloud-dependencies
(似乎已弃用)、spring-cloud-netflix
等无济于事。
添加什么正确的依赖关系才能让它工作?
看起来 this forum post and the dependency you need for HttpClients
is org.apache.httpcomponents/httpclient 中的问题至少是 4.3.3
。
您的功能区依赖项通过 ribbon-httpclient 2.2.2
管理以下工件,最高版本为 4.5.3
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcomponents-client</artifactId>
<version>4.5.3</version>
我建议为 httpcomponents-client
添加显式依赖项并将其从所有其他项中排除。
换句话说尝试在编译时添加它。不是运行时:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
我有一个简单的 Spring 引导应用程序,它有一个简单的 REST 客户端,看起来像这样:
@Service
public class MyRestClient {
private static final String url = "http://localhost:8080/";
private RestTemplate restTemplate;
@Autowired
public MyRestClient(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
public String invoke() {
return restTemplate.getForObject(url, String.class);
}
}
这与 Spring Boot 完美配合。
现在我正尝试将 Spring Cloud
添加到项目中以实现功能区客户端负载平衡。我点击了这里的链接:
https://spring.io/guides/gs/client-side-load-balancing/
或这里的这个,它似乎是复制和粘贴但具有更多更新的依赖项:
http://www.baeldung.com/spring-cloud-rest-client-with-netflix-ribbon
即使不向 MyRestClient
添加任何注释,我添加以下内容的那一刻:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.3.4.RELEASE</version>
</dependency>
我得到以下异常:
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.web.client.RestTemplate]: Factory method 'restTemplate' threw exception; nested exception is java.lang.NoClassDefFoundError: org/apache/http/impl/client/HttpClients
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) ~[spring-beans-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) ~[spring-beans-4.3.11.RELEASE.jar:4.3.11.RELEASE]
... 31 common frames omitted
Caused by: java.lang.NoClassDefFoundError: org/apache/http/impl/client/HttpClients
at org.springframework.http.client.HttpComponentsClientHttpRequestFactory.<init>(HttpComponentsClientHttpRequestFactory.java:88) ~[spring-web-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_131]
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_131]
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_131]
at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_131]
at java.lang.Class.newInstance(Class.java:442) ~[na:1.8.0_131]
at org.springframework.beans.BeanUtils.instantiate(BeanUtils.java:77) ~[spring-beans-4.3.11.RELEASE.jar:4.3.11.RELEASE]
at org.springframework.boot.web.client.RestTemplateBuilder.detectRequestFactory(RestTemplateBuilder.java:596) ~[spring-boot-1.5.7.RELEASE.jar:1.5.7.RELEASE]
at org.springframework.boot.web.client.RestTemplateBuilder.configureRequestFactory(RestTemplateBuilder.java:559) ~[spring-boot-1.5.7.RELEASE.jar:1.5.7.RELEASE]
at org.springframework.boot.web.client.RestTemplateBuilder.configure(RestTemplateBuilder.java:527) ~[spring-boot-1.5.7.RELEASE.jar:1.5.7.RELEASE]
at org.springframework.boot.web.client.RestTemplateBuilder.build(RestTemplateBuilder.java:515) ~[spring-boot-1.5.7.RELEASE.jar:1.5.7.RELEASE]
at org.springframework.boot.web.client.RestTemplateBuilder.build(RestTemplateBuilder.java:501) ~[spring-boot-1.5.7.RELEASE.jar:1.5.7.RELEASE]
为什么我的 REST 客户端在没有此依赖项的情况下工作,但没有添加任何注释或任何东西,当我添加此依赖项时,我得到此异常?
我尝试从文档或示例中添加各种依赖项,例如 spring-cloud-dependencies
(似乎已弃用)、spring-cloud-netflix
等无济于事。
添加什么正确的依赖关系才能让它工作?
看起来 this forum post and the dependency you need for HttpClients
is org.apache.httpcomponents/httpclient 中的问题至少是 4.3.3
。
您的功能区依赖项通过 ribbon-httpclient 2.2.2
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcomponents-client</artifactId>
<version>4.5.3</version>
我建议为 httpcomponents-client
添加显式依赖项并将其从所有其他项中排除。
换句话说尝试在编译时添加它。不是运行时:
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>