J'utilise les composants HttpClient d'Apache pour le programme simple suivant et je vois l'exception ci-dessous:
Exception dans le fil "principal" Java.lang.NoSuchFieldError: INSTANCE à org.Apache.http.impl.io.DefaultHttpRequestWriterFactory. (DefaultHttpRequestWriterFactory.Java:52) à org.Apache.http.impl.io.DefaultHttpRequestWriterFactory. (DefaultHttpRequestWriterFactory.Java:56) à org.Apache.http.impl.io.DefaultHttpRequestWriterFactory. (DefaultHttpRequestWriterFactory.Java:46) à org.Apache.http.impl.conn.ManagedHttpClientConnectionFactory. (ManagedHttpClientConnectionFactory.Java:72) à org.Apache.http.impl.conn.ManagedHttpClientConnectionFactory. (ManagedHttpClientConnectionFactory.Java:84) à org.Apache.http.impl.conn.ManagedHttpClientConnectionFactory. (ManagedHttpClientConnectionFactory.Java:59) à org.Apache.http.impl.conn.PoolingHttpClientConnectionManager $ InternalConnectionFactory. (PoolingHttpClientConnectionManager.Java:487) à org.Apache.http.impl.conn.PoolingHttpClientConnectionManager. (PoolingHttpClientConnectionManager.Java:147) à org.Apache.http.impl.conn.PoolingHttpClientConnectionManager. (PoolingHttpClientConnectionManager.Java:136) at org.Apache.http.impl.conn.PoolingHttpClientConnectionManager. (PoolingHttpClientConnectionManager.Java:112) à org.Apache.http.impl.client.HttpClientBuilder.build (HttpClientBuilder.Java:726) à l'adresse com.starwood.rms.controller.property.HttpExample.main (HttpExample.Java:14)
public class HttpExample { public static void main (String [] args) { Client HttpClient = HttpClientBuilder.create (). Build (); HttpGet request = new HttpGet ("https://www.google.com/?q=Java"); essayez { HttpResponse response = client.execute (demande); System.out.println (response.getStatusLine ()); } catch (exception e) { e.printStackTrace (); } } }
J'utilise
Des idées?
Ce code fonctionne ... sans erreur .. vérifiez les packages si vous utilisez une importation similaire.
package com.jai.http;
import org.Apache.http.HttpResponse;
import org.Apache.http.client.HttpClient;
import org.Apache.http.client.methods.HttpGet;
import org.Apache.http.impl.client.HttpClientBuilder;
public class HttpExample {
/**
* @param args
*/
public static void main(String[] args) {
HttpClient client = HttpClientBuilder.create().build();
HttpGet request = new HttpGet("https://www.google.com/?q=Java");
try {
HttpResponse response = client.execute(request);
System.out.println(response.getStatusLine());
} catch (Exception e) {
e.printStackTrace();
}
}
}
J'ai eu ce problème avec Hadoop. Il utilisait une ancienne version de httpclient-4.2.5.jar
et httpcore-4.2.5.jar
dans leur bibliothèque partagée.
J'ai résolu ce problème en ombrageant des parties via maven-shade-plugin
<relocations>
<relocation>
<pattern>org.Apache.http</pattern>
<shadedPattern>shaded.org.Apache.http</shadedPattern>
</relocation>
</relocations>
En regardant le code source de DefaultHttpRequestWriterFactory
package org.Apache.http.impl.io;
import org.Apache.http.HttpRequest;
import org.Apache.http.annotation.Immutable;
import org.Apache.http.io.HttpMessageWriter;
import org.Apache.http.io.HttpMessageWriterFactory;
import org.Apache.http.io.SessionOutputBuffer;
import org.Apache.http.message.BasicLineFormatter;
import org.Apache.http.message.LineFormatter;
@Immutable
public class [More ...] DefaultHttpRequestWriterFactory implements HttpMessageWriterFactory<HttpRequest> {
public static final DefaultHttpRequestWriterFactory INSTANCE = new DefaultHttpRequestWriterFactory();
private final LineFormatter lineFormatter;
public [More ...] DefaultHttpRequestWriterFactory(final LineFormatter lineFormatter) {
super();
this.lineFormatter = lineFormatter != null ? lineFormatter : BasicLineFormatter.INSTANCE;
}
public [More ...] DefaultHttpRequestWriterFactory() {
this(null);
}
public HttpMessageWriter<HttpRequest> [More ...] create(final SessionOutputBuffer buffer) {
return new DefaultHttpRequestWriter(buffer, lineFormatter);
}
}
Êtes-vous sûr que vous utilisez HttpCore 4.3.2? DefaultHttpRequestWriterFactory
essayer de résoudre
BasicLineFormatter.INSTANCE
champ mais ne peut pas le trouver.
Recherchez dans votre chemin d'accès aux bibliothèques des bibliothèques pouvant contenir une autre classe BasicLineFormatter
. Peut-être avez-vous un HttpCore d'une ancienne version en conflit avec la version 4.3.2.
Causée par: Java.lang.NoSuchFieldError: INSTANCE
une des solutions de Java.lang.NoSuchFieldError: INSTANCE : Cela se produit si nous avons deux versions diff de la même classe dans notre chemin de classe…. […], Donc nous trouvons d'abord cette classe (une version de la classe), cliquez sur cette classe, sélectionnez "chemin de construction", puis nous cliquons sur "supprimer du chemin de construction". par 333ccc333
J'ai eu ce problème. Il semble qu'il y ait un problème lors de l'initialisation de HttpClient avec HttpClientBuilder.create (). Build (). Si vous voulez une solution plus immédiate, utilisez simplement la nouvelle valeur DefaultHttpClient () pour initialiser HttpClient.
HttpClient client = new DefaultHttpClient();
Pour ceux qui utilisent Websphere, assurez-vous que votre stratégie de chargement de classe est définie sur "Parent Last", sinon cela ne fonctionnera pas car WAS utilise sa propre version de http commun qui peut être en conflit.
J'ai eu ce problème aussi, j'ai réalisé que c'était lorsque nous avons mis à niveau vers Java 1.8, je viens de passer à la version 1.7 et fonctionne comme prévu . Je ne sais pas pourquoi la version est devenue un problème.
Cela aussi, et Eclipse, m'a frustré jusqu'à ce que je réalise que, semblable au conseil de Pat B dans Webpshere, cela pose des problèmes à Eclipse si les dépendances sont dans le mauvais ordre.
Properties -> Java Build Path -> Order and Export
Jouez un peu ici avec l'ordre du noyau et du client.