spring - spring-cloud-starter-ribbon 缺少 HTTP 客户端依赖项

标签 spring rest spring-boot spring-cloud spring-cloud-netflix

我有一个简单的 Spring Boot 应用程序,它有一个简单的 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 添加到项目中以实现 Ribbon 客户端负载平衡。我点击了这里的链接:

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 中的问题HttpClients 所需的依赖项是 org.apache.httpcomponents/httpclient版本至少为 4.3.3

关于spring - spring-cloud-starter-ribbon 缺少 HTTP 客户端依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46270197/

相关文章:

java - 如何在spring框架中更新实时字段值

java - 如何 Autowiring Spring TaskExecutor 创建的线程?

java - 将 Spring Boot 应用程序部署到 Elastic Beanstalk 时出现 502 Bad Gateway

spring-security - 应该使用什么代替 1.4.0.RELEASE 中弃用的 SpringBootServletInitializer

c# - WCF Restful 服务 GET/POST

spring-boot - Spring Boot + 批处理 : Injected/Autowired beans are null in ItemReader

spring - WebApplicationInitializer的onStartup方法永远不会被调用

java - Coinbase API 测试买卖 API

rest - 根据身份验证凭据返回不同的输出是 RESTful 吗?

java - 使用 Spring REST 服务的拦截器