2013-07-25 5 views
14

निम्नलिखित कोड होने से:स्प्रिंग रेस्ट कंट्रोलर में सादे जेसन बॉडी का उपयोग कैसे करें?

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

स्ट्रिंग json तर्क हमेशा के बावजूद json शरीर में भेजा जा रहा रिक्त है।

नोट कि मैं स्वचालित प्रकार रूपांतरण नहीं चाहता हूं, मैं सिर्फ सादा जेसन परिणाम चाहता हूं।

यह उदाहरण के लिए काम करता है:

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

शायद मैं उपयोग ServletRequest या InputStream तर्क वास्तविक शरीर को पुनः प्राप्त करने के रूप में उपयोग कर सकते हैं, लेकिन मुझे आश्चर्य है कि एक आसान तरीका उपलब्ध है?

+0

'स्ट्रिंग jsonBody = IOUtils.toString (request.getInputStream());' अपाचे के साथ एक लाइनर आप इसे जल्दी से किया की जरूरत है। [और इसी तरह का सवाल।] (Http://stackoverflow.com/questions/5806724/springs-requestbody-providing-empty-string-on-post) – madhead

+0

यह शायद वास्तव में काम करेगा, हालांकि मैं http प्राप्त करने से छुटकारा पाना चाहता हूं कार्रवाई में तर्क के रूप में अनुरोध करें, और स्प्रिंग को स्वचालित रूप से एक var में सामग्री प्राप्त करने दें ... (वैसे भी आपके उत्तर के लिए धन्यवाद) –

उत्तर

28

सबसे अच्छा तरीका है मैं अब तक पाया जाता है:

@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 

मुझे पता है अगर वहाँ अन्य विकल्प हैं करते हैं।

1

सबसे आसान तरीका है कि मेरे लिए काम करता

@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

है तुम बस का उपयोग कर सकते

@RequestBody String pBody

+1

यह मेरे लिए काम नहीं करता है। मुझे यूआरएल-एन्कोडेड फॉर्म डेटा स्ट्रिंग प्राप्त हो रही है जिसमें यूआरएल क्वेरी पैरामीटर और POST डेटा दोनों शामिल हैं, न कि आवश्यकतानुसार डेटा की कच्ची JSON प्रति। – Jules

+0

क्या आप सामग्री-प्रकार के रूप में एप्लिकेशन/जेसन का उपयोग कर रहे हैं ?? – aGO

+0

हां। क्रोम के इंस्पेक्टर के माध्यम से अनुरोध की जांच की गई और सभी शीर्षलेख सामग्री-प्रकार सहित अच्छे दिखते हैं। लेकिन वसंत यूआरएल-एन्कोडिंग है, इसे यूआरएल-एन्कोडेड क्वेरी स्ट्रिंग में जोड़ रहा है, और मुझे यह दे रहा है। उपरोक्त @ डेविडकासिडी का दृष्टिकोण, ठीक काम करता है। – Jules

0

केवल HttpServletRequest मेरे लिए काम किया। HttpEntity शून्य स्ट्रिंग दिया।

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!"; 
} 
संबंधित मुद्दे