2013-07-25 14 views
14

Aşağıdaki kodu olması:Yaylı kontrol ünitesinde düz json gövdesine nasıl erişilir?

@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!"; 
} 

Dize json argüman her zaman json vücutta gönderilmesine rağmen boş.

Not Otomatik olarak dönüştürmeyi istemediğim için no'lu adres, yalnızca düz json sonucunu istiyorum.

@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); 
} 

Muhtemelen kullanımını gerçek naaşı teslim almak üzere argüman olarak ServletRequest veya inputStream kullanabilirsiniz, ama daha kolay bir yol olup olmadığını merak: Örneğin

Bu

çalışır? Şu ana kadar bulunan

+0

'String jsonBody = IOUtils.toString (request.getInputStream());' hızlı bir şekilde ihtiyacınız varsa Apache ile tek liner. [Ve benzer bir soru.] (Http://stackoverflow.com/questions/5806724/springs-requestbody-providing-empty-string-on-post) – madhead

+0

Bu muhtemelen işe yarayacaktır, ancak http olmaktan kurtulmak istiyorum. argüman olarak harekete geçin ve Spring'in içeriği otomatik olarak almasına izin verin ... (yine de cevabınız için teşekkürler) –

cevap

28

En yoludur:

@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 

başka alternatifler varsa bana bildirin. benim için çalışıyor

1

basit yolu sadece

@RequestBody String pBody

3

olduğunu. HttpEntity boş bir ip verdi.

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!"; 
} 
+1

Bu benim için işe yaramıyor. Verilerin gerektiği gibi ham bir JSON kopyasını değil, hem URL sorgu parametrelerini hem de POST verilerini içeren bir URL kodlu form veri dizesi alıyorum. – Jules

+0

Uygulama/json'u içerik türü olarak kullanıyor musunuz? – aGO

+0

Evet. İstek, krom denetçisiyle kontrol edildi ve içerik başlıkları da dahil olmak üzere tüm başlıklar iyi görünüyor. Ancak Bahar, URL’yi kodlayarak URL kodlu sorgu dizesine ekler ve bana bunu verir. @ davidcassidy'nin yaklaşımı yukarıda, ancak, iyi çalışır. – Jules

0

Sadece HttpServletRequest benim için çalıştı kullanabilirsiniz

@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"; 
} 
İlgili konular