2012-06-08 8 views
21

Sto creando un test unitario per provare il servlet appena creato.Creazione di un UrlEncodedFormEntity da un elenco di NameValuePairs genera 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 seguente riga genera un NullPointerException:

post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 

C'è qualcosa che mi manca?

risposta

29

Siamo spiacenti per la domanda stupida, appena risolto aggiungendo il formato utf-8.

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

Creazione di un UrlEncodedFormEntity senza passare il formato userà DEFAULT_CONTENT_CHARSET che è ISO-8859-1

Il che mi sconcerta ... quale è la causa di gettare NullPointerException?

+1

penso che si può accettare la vostra risposta ora. Ho avuto la stessa eccezione e l'aggiunta della codifica ha risolto il problema. Grazie. –

+1

Penso che questa non sia una domanda stupida con 10 like :), il mio problema è simile anche a te Grazie. –

+1

Questo mi ha salvato la giornata: avevo valori di utf-8 nelle coppie, e quindi non venivano codificati correttamente - stava lanciando il carattere utf-8, come farebbe la ISO-8859-1! Grazie! – rfay

11

Non è una domanda stupida. Credo che la confusione è che in HttpClient 4.1, nessun formato di codifica era necessario-Questo ha funzionato:

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

Quando ho cambiato la dipendenza da HttpClient 4.2 per accedere URIBuilder, ho ottenuto:

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, sembra che il costruttore richieda la codifica, come hai notato. Confusamente, il documento specifica che il vecchio costruttore è ancora disponibile, ma sembra non funzionare più.

UrlEncodedFormEntity pubblico (parametri List) doc

+0

Ora ha senso, evviva. –

+1

Sembra che questa sia una regressione nota: http://mail-archives.apache.org/mod_mbox/hc-httpclient-users/201205.mbox/%[email protected]%3E –