Java 当ApacheHttpClientHandler与Jersey1.18一起用于POST请求时,会引发NullPointerException
我们正在使用Jersey 1.18使用RESTAPI。我们希望在使用RESTAPI时使用Jakarta Commons HttpClient 3.1作为后端。因此,我们使用ApacheHttpClientHandler从HttpClient获取Jersey客户端的对象。 对于GET请求,它可以正常工作。然而,当我们调用POST请求时,我们会得到NullPointer异常。以下是带错误消息的代码摘录: /*使用ApacheHttpClientHandler抛出NPE的POST调用代码*/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
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客户端一起使用时,才会出现问题