为什么HttpClient需要httpasyncclient?

时间:2016-11-24 16:02:36

标签: java spring apache-httpcomponents

我使用Spring和Apache HTTPComponents编写了一个简单的Java HTTP客户端应用程序。当我运行它时,它失败,例外:

java.lang.NoClassDefFoundError: org/apache/http/nio/client/HttpAsyncClient
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at my.package.<init>(MyClientTest.java:60)

这一行的代码是:

 private final RestTemplate restTemplate = 
     new RestTemplate(new HttpComponentsAsyncClientHttpRequestFactory());

我可以通过在构建中添加依赖项来解决这个问题:

   <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpasyncclient</artifactId>
        <version>4.1.2</version>
        <scope>test</scope>
   </dependency>

但为什么我需要这样做呢?我没有做任何显式异步的事情。我认为Maven应该自动引入必要的依赖。

1 个答案:

答案 0 :(得分:-1)

检查您是否有意外请求异步请求工厂 - 例如:

private final RestTemplate restTemplate = 
     new RestTemplate(new HttpComponentsAsyncClientHttpRequestFactory());

当我遇到这个问题时,IDE自动完成功能给了我HttpComponentsAsyncClientHttpRequestFactory - 可能是因为它按字母顺序排在HttpComponentsClientHttpRequestFactory之前,我看起来不够仔细,看不到Async隐藏在那里

HttpComponentsAsyncClientHttpRequestFactory是Spring的一部分,并且对Apache的HttpAsyncClient具有运行时依赖性。

如果您改为使用HttpComponentsClientHttpRequestFactory,则不需要httpasyncclient jar。