2012-06-08 10 views
21

Estoy creando una prueba de unidad para probar el servlet que acabo de crear.Crear una UrlEncodedFormEntity a partir de una lista de NameValuePairs arroja una NullPointerException

@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 siguiente línea genera una NullPointerException:

post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

¿Hay algo que me falta?

Respuesta

29

Perdón por la estúpida pregunta, acabo de resolver agregando el formato utf-8.

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

Creación de una UrlEncodedFormEntity sin pasar el formato utilizará DEFAULT_CONTENT_CHARSET que es ISO-8859-1

Lo que me desconcierta ... ¿qué está haciendo que se tire NullPointerException?

+1

creo que se puede aceptar su respuesta ahora. Tuve la misma excepción y al agregar la codificación resolví mi problema. Gracias. –

+1

Creo que esta no es una pregunta estúpida con 10 me gusta :), mi problema también es similar a ti Gracias. –

+1

Esto me salvó el día: tenía los valores de UTF-8 en los pares, y por lo tanto no se codificaban correctamente: ¡lanzaba el carácter UTF-8, como lo haría ISO-8859-1! ¡Gracias! – rfay

11

No es una pregunta estúpida en absoluto. Creo que la confusión es que en httpclient 4.1, hay un formato de codificación era necesario- Esto funcionó:

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

Cuando cambié la dependencia a HttpClient 4.2 con el fin de acceder URIBuilder, llegué:

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)... 

Con 4.2, parece que el constructor requiere la codificación, como has notado. Confusamente, el documento especifica que el antiguo constructor todavía está disponible, pero parece que ya no funciona.

UrlEncodedFormEntity pública (Lista de parámetros) doc

+0

Tiene sentido ahora, salud. –

+1

Parece que esta es una regresión conocida: http://mail-archives.apache.org/mod_mbox/hc-httpclient-users/201205.mbox/%[email protected]%3E –

Cuestiones relacionadas