La création D'une UrlEncodedFormEntity à partir d'une liste de NameValuePairs génère une NullPointerException

Je crée un test unitaire pour essayer la 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 exception NullPointerException:

post.setEntity(new UrlEncodedFormEntity(nameValuePairs));

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

21
demandé sur Kevin D. 2012-06-08 05:58:01

2 réponses

Désolé pour la question stupide, juste résolu en ajoutant le format utf-8.

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

La Création d'un UrlEncodedFormEntity sans passer par le format à utiliser DEFAULT_CONTENT_CHARSET qui ISO-8859-1

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

29
répondu Kevin D. 2012-06-22 13:06:14

Pas une question stupide du tout. 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 à URIBuilder , 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 confuse, le doc spécifie que l'ancien constructeur est toujours disponible, mais il ne semble plus fonctionner.

UrlEncodedFormEntity Publique (Liste les paramètres) doc

11
répondu Max P Magee 2012-06-26 16:29:03