2013-07-25 12 views
14

Avendo il seguente codice:Come accedere al corpo del json normale nel controller di riposo a molla?

@RequestMapping(value = "/greeting", method = POST, consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) 
@ResponseBody 
public String greetingJson(@RequestBody String json) { 
    System.out.println("json = " + json); // TODO json is null... how to retrieve plain json body? 
    return "Hello World!"; 
} 

stringa argomento json è sempre nullo nonostante json inviato nel corpo.

Nota che non voglio la conversione di tipo automatico, voglio solo il semplice risultato JSON.

Questo per esempio funziona:

@RequestMapping(value = "/greeting", method = POST, consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) 
@ResponseBody 
public String greetingJson(@RequestBody User user) { 
    return String.format("Hello %s!", user); 
} 

Probabilmente posso usare l'utilizzo del ServletRequest o InputStream come argomento per recuperare il corpo reale, ma mi chiedo se c'è un modo più semplice?

+0

'String = jsonBody IOUtils.toString (request.getInputStream());' one-liner con Apache se ne avete bisogno fatto in fretta. [E una domanda simile.] (Http://stackoverflow.com/questions/5806724/springs-requestbody-providing-empty-string-on-post) – madhead

+0

Probabilmente funzionerà, tuttavia mi piacerebbe sbarazzarmi di avere http richiedi come argomenti in azione, e consenti a Spring di ottenere automaticamente il contenuto in una var ... (grazie comunque per la tua risposta) –

risposta

28

migliore modo che ho trovato fino ad ora è:

@RequestMapping(value = "/greeting", method = POST, consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) 
@ResponseBody 
public String greetingJson(HttpEntity<String> httpEntity) { 
    String json = httpEntity.getBody(); 
    // json contains the plain json string 

fatemi sapere se ci sono altre alternative.

1

modo più semplice che funziona per me è

@RequestMapping(value = "/greeting", method = POST, consumes = MediaType.ALL_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) 
@ResponseBody 
public String greetingJson(String raw) { 
    System.out.println("json = " + raw); 
    return "OK"; 
} 
3

Si può semplicemente utilizzare

@RequestBody String pBody

+1

Questo non funziona per me. Ho ricevuto una stringa di dati del modulo con codifica URL contenente sia i parametri di query URL che i dati POST, non una copia JSON raw dei dati come richiesto. – Jules

+0

Stai usando application/json come content-type ?? – aGO

+0

Sì. Controllato la richiesta tramite l'ispettore di chrome e tutte le intestazioni sembrano buone, incluso il tipo di contenuto. Ma Spring lo sta codificando su URL, aggiungendolo alla stringa di query con codifica URL e dandomi questo. L'approccio di @ davidcassidy sopra, tuttavia, funziona bene. – Jules

0

Solo HttpServletRequest ha lavorato per me. HttpEntity ha dato una stringa nulla.

import java.io.IOException; 
import javax.servlet.http.HttpServletRequest; 
import org.apache.commons.io.IOUtils; 

@RequestMapping(value = "/greeting", method = POST, consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) 
@ResponseBody 
public String greetingJson(HttpServletRequest request) throws IOException { 
    final String json = IOUtils.toString(request.getInputStream()); 
    System.out.println("json = " + json); 
    return "Hello World!"; 
} 
Problemi correlati