web-dev-qa-db-fra.com

La création d'un UrlEncodedFormEntity à partir d'une liste de NameValuePairs lève une NullPointerException

Je crée un test unitaire pour essayer le servlet que je viens de créer.

@Test
public void test() throws ParseException, IOException {

  HttpClient client = new DefaultHttpClient();
  HttpPost post = new HttpPost("http://localhost:8080/WebService/MakeBaby");

  List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

  nameValuePairs.add(new BasicNameValuePair("father_name", "Foo"));
  nameValuePairs.add(new BasicNameValuePair("mother_name", "Bar"));

  post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
  HttpResponse response = null;

  try {
    response = client.execute(post);
  } catch (ClientProtocolException e) {
    e.printStackTrace();
  } catch (IOException e) {
    e.printStackTrace();
  }

  String stringifiedResponse = EntityUtils.toString(response.getEntity());

  System.out.println(stringifiedResponse);

  assertNotNull(stringifiedResponse);
}

La ligne suivante génère une NullPointerException:

post.setEntity(new UrlEncodedFormEntity(nameValuePairs));

Y a-t-il quelque chose qui me manque?

21
Kevin D.

Désolé pour la question stupide, je viens de la résoudre en ajoutant le format utf-8.

post.setEntity(new UrlEncodedFormEntity(nameValuePairs, "utf-8"));

Créer un UrlEncodedFormEntity sans passer le format utilisera DEFAULT_CONTENT_CHARSET lequel est ISO-8859-1

Ce qui me déroute ... qu'est-ce qui le fait lancer NullPointerException?

33
Kevin D.

Pas du tout une question stupide. Je pense que la confusion est que dans httpclient 4.1, aucun format d'encodage n'était requis - Cela a fonctionné:

HttpEntity entity = new UrlEncodedFormEntity(params);
method.setEntity(entity);

Quand j'ai changé la dépendance en httpclient 4.2 afin d'accéder à RIBuilder , j'ai obtenu:

Java.lang.NullPointerException
at org.Apache.http.entity.StringEntity.<init>(StringEntity.Java:70)
at org.Apache.http.client.entity.UrlEncodedFormEntity.<init>(UrlEncodedFormEntity.Java:78)
at org.Apache.http.client.entity.UrlEncodedFormEntity.<init>(UrlEncodedFormEntity.Java:92)...

Avec 4.2, il semble que le constructeur nécessite l'encodage, comme vous l'avez noté. De manière déroutante, le document spécifie que l'ancien constructeur est toujours disponible, mais il ne semble plus fonctionner.

public UrlEncodedFormEntity (Liste des paramètres) doc

10
Max P Magee