HTTPClient - NoSuchMethodError für .releaseConnection
Baue ich ein Test-Projekt mit HTTPClient zu testen, restful services. Hier ist der code, den ich bisher erfolgreich benutzen, um ein 200 OK als Antwort auf eine GET. Ich bin jedoch immer ein Fehler auf .releaseConnection, die HTTPClient-Dokumentation sagt, ist wichtig.
Code:
public class Container {
public String tryGet() {
String getResult = null;
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://test.url");
try {
HttpResponse response1 = httpclient.execute(httpGet);
System.out.println(response1.getStatusLine());
getResult = response1.getStatusLine().toString();
} catch (ClientProtocolException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} finally {
httpGet.releaseConnection();
}
return getResult;
}
}
Beim laufen mein junit-test, bekomme ich die folgende Fehlermeldung im Zusammenhang mit .releaseConnection():
java.lang.NoSuchMethodError: org.apache.http.client.methods.HttpGet.releaseConnection()V
at com.qa.Container.tryGet(CreativeContainer.java:49)
at com.qa.SandboxTest.test(SandboxTest.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:44)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Der code ist hässlich, ich weiß. Ich fange gerade mit dieser.
- Ich denke, es könnte auch gut sein, zu Fragen..... warum brauche ich, um die Verbindung zu lösen? Ist das etwas, was ich brauchen, um über sorgen mit einer RESTful-service?
- siehe stackoverflow.com/questions/12839473/...
- Die HttpClient-version verwenden Sie? Die releaseConnection Methode ist verfügbar seit 4.2
- Ich bin mit 4.2.2. Ich fügte hinzu, alle aktuellen Krüge, um das Projekt Bibliotheken beschrieben wurden, wie hier gefordert: hc.apache.org/httpcomponents-client-ga/quickstart.html
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Methode HttpRequestBase#releaseConnection() definitiv wurde Hinzugefügt in version 4.2.
Wahrscheinlich haben Sie die jar-Hölle. Wenn der compiler hat keine Kompilierungsfehler eine andere version der Klasse geladen werden kann, zur Laufzeit. Die eigentliche Ursache ist, hängt von Ihren build-tool. Wenn Sie mit maven/gradle kann es einige transitive Abhängigkeit.
Also eigentlich HttpRequestBase#releaseConnection() Methode nur proxy-Aufruf an AbstractExecutionAwareRequest#reset(). Und AbstractExecutionAwareRequest#reset() nur cancel-Methode der Ausführung. Wahrscheinlich es ist nicht das, was Sie brauchen.
Den richtigen Weg zu führen-und release-httpClient-Ressourcen ist zu schließen, httpResponse, das heißt, Sie können die release-Thread im httpClient-internen threadPool.
Den Schnellstart ist nicht wirklich klar, auf alle die Gläser, die Sie verwenden müssen httpclient 4.2.2. Erstellt habe ich ein Maven-Projekt mit dependency org.apache.httpcomponents:httpclient:4.2.2 und habe folgende zusätzliche Gläser:
Kopiert habe ich Ihren code (verändert die HttpGet-url "https://www.google.com/") und lief ein JUnit-test, gab es keine Fehler.
Den ".releaseConnection()" ist in der Tat erforderlich, um sicherzustellen verbindungen geschlossen werden (nachdem etwas schief gegangen ist). Weglassen ".releaseConnection()" konnte es zu offenen verbindungen nichts zu tun, die auf Ihrem system.
Da Sie noch in einer Entwicklungs-start-phase, würde ich die Beratung mit den letzten HttpClient 4.3.x-version (derzeit 4.3.1). Die version 4.3 enthält einige gute Verbesserungen gegenüber der version 4.2, aber auch die Verwendung hat sich geändert. E. g. in der quickstart Sie werden sehen, dass ".releaseConnection()" wird nicht mehr verwendet (es ist veraltet), sondern das response-Objekt wird geschlossen, um verbindungen geschlossen sind.
Diese Methode eingeführt wurde, seit der version 4.2 sehen javadoc
So müssen Sie mit Versionen > 4.2 getestet habe ich es mit der version 4.3.1 und funktioniert Prima.
http://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient/4.3.1
verwenden httpcomponents-client-4.2.1