Java 当ApacheHttpClientHandler与Jersey1.18一起用于POST请求时,会引发NullPointerException

Java 当ApacheHttpClientHandler与Jersey1.18一起用于POST请求时,会引发NullPointerException,java,rest,apache-commons-httpclient,jersey-client,Java,Rest,Apache Commons Httpclient,Jersey Client,我们正在使用Jersey 1.18使用RESTAPI。我们希望在使用RESTAPI时使用Jakarta Commons HttpClient 3.1作为后端。因此,我们使用ApacheHttpClientHandler从HttpClient获取Jersey客户端的对象。 对于GET请求,它可以正常工作。然而,当我们调用POST请求时,我们会得到NullPointer异常。以下是带错误消息的代码摘录: /*使用ApacheHttpClientHandler抛出NPE的POST调用代码*/ impo

我们正在使用Jersey 1.18使用RESTAPI。我们希望在使用RESTAPI时使用Jakarta Commons HttpClient 3.1作为后端。因此,我们使用ApacheHttpClientHandler从HttpClient获取Jersey客户端的对象。 对于GET请求,它可以正常工作。然而,当我们调用POST请求时,我们会得到NullPointer异常。以下是带错误消息的代码摘录:

/*使用ApacheHttpClientHandler抛出NPE的POST调用代码*/

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.client.apache.ApacheHttpClientHandler;

HttpClient httpClient = new HttpClient();
ApacheHttpClientHandler clientHandler = new ApacheHttpClientHandler(httpClient);
String url = "http://petstore.swagger.wordnik.com:80/api/store/order";
WebResource.Builder builder = new Client(clientHandler).resource(url).accept("application/json").entity("{}", "application/json");
ClientResponse clientResponse = null;
try {
        clientResponse = builder.post(ClientResponse.class);
    } finally {
        if (clientResponse != null) {
            clientResponse.close();
        }
    }

System.out.println("Status: " + clientResponse.getStatus());
我们收到的错误:

Exception in thread "main" java.lang.NullPointerException code
at com.sun.jersey.api.client.RequestWriter$RequestEntityWriterImpl.<init>(RequestWriter.java:186)
at com.sun.jersey.api.client.RequestWriter.getRequestEntityWriter(RequestWriter.java:248)
at     com.sun.jersey.client.apache.DefaultApacheHttpMethodExecutor.executeMethod(DefaultApacheHttpMethodExecutor.java:121)
at     com.sun.jersey.client.apache.ApacheHttpClientHandler.handle(ApacheHttpClientHandler.java:175)
at com.sun.jersey.api.client.Client.handle(Client.java:652)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:682)
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
at com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:560)
线程“main”java.lang.NullPointerException代码中的异常 位于com.sun.jersey.api.client.RequestWriter$RequestEntityWriterImpl.(RequestWriter.java:186) 在com.sun.jersey.api.client.RequestWriter.getRequestEntityWriter(RequestWriter.java:248)上 位于com.sun.jersey.client.apache.DefaultApacheHttpMethodexecuteMethod(DefaultApacheHttpMethodExecutor.java:121) 位于com.sun.jersey.client.apache.ApacheHttpClientHandler.handle(ApacheHttpClientHandler.java:175) 位于com.sun.jersey.api.client.client.handle(client.java:652) 位于com.sun.jersey.api.client.WebResource.handle(WebResource.java:682) com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74) 位于com.sun.jersey.api.client.WebResource$Builder.post(WebResource.java:560) 如果我们将客户机创建从new client(clientHandler)更改为new client(),则会得到预期的响应

类路径中的jar文件

  • commons-httpclient-3.1.jar
  • jersey-client-1.18.jar
  • jersey-apache-client-1.18.jar
  • commons-logging-1.0.4.jar
  • jersey-core-1.18.jar
  • commons-codec-1.2.jar

有没有人遇到过类似的问题,并且知道这个问题的解决方法?

问题是
ApacheHttpClientHandler
没有以这种方式注入(这是一个bug,感谢您的归档)。但是,您可以使用以下方法创建客户端:

ApacheHttpClient client = ApacheHttpClient.create();
然后,您可以通过以下方式配置
HttpClient

client.getClientHandler().getHttpClient();

使用Mozilla中的REST客户端或任何其他客户端(如SOAP UI)进行第一次测试,以查看是否有POST和检查结果。当通过Mozilla中的任何REST客户端调用API时,甚至使用不带ApacheClientHandler的jersey客户端时,API工作正常。只有当我们将ApacheClientHandler与Jersey客户端一起使用时,才会出现问题