java - स्प्रिंग बूट में प्रतिक्रिया के रूप में JSON ऑब्जेक्ट लौटना




spring-boot (4)

मेरे पास स्प्रिंग बूट में एक नमूना RestController है:

@RestController
@RequestMapping("/api")
class MyRestController
{

    @GetMapping(path = "/hello")
    public JSONObject sayHello()
    {
        return new JSONObject("{'aa':'bb'}");
    }


}

मैं JSON लाइब्रेरी org.json का उपयोग कर रहा org.json

जब मैंने एपीआई /hello मारा, तो मुझे यह कहते हुए एक अपवाद मिलेगा:

सर्विसलेट [) सर्वलेट के लिए (dispatcherServlet] पथ के संदर्भ में [] फेंक दिया अपवाद [अनुरोध प्रसंस्करण विफल रहा; नेस्टेड अपवाद java.lang.IllegalArgumentException है: प्रकार के वापसी मूल्य के लिए कोई कनवर्टर नहीं मिला: वर्ग org.json.JSONObject] मूल कारण के साथ

java.lang.IllegalArgumentException: कोई भी कनवर्टर प्रकार का रिटर्न मान नहीं मिला: class org.json.JSONObject

मामला क्या है? क्या कोई समझा सकता है कि वास्तव में क्या हो रहा है?


आप इसके लिए हैशमैप का उपयोग भी कर सकते हैं

@GetMapping
public HashMap<String, Object> get() {
    HashMap<String, Object> map = new HashMap<>();
    map.put("key1", "value1");
    map.put("results", somePOJO);
    return map;
}

आप या तो String रूप में एक प्रतिक्रिया वापस कर सकते हैं जैसा कि @vagaasen द्वारा सुझाया गया है या आप नीचे दिए गए स्प्रिंग द्वारा प्रदान की गई ResponseEntity Object का उपयोग कर सकते हैं। इस तरह से आप Http status code भी वापस कर सकते हैं जो कि webservice कॉल में अधिक सहायक है।

@RestController
@RequestMapping("/api")
public class MyRestController
{

    @GetMapping(path = "/hello", produces=MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Object> sayHello()
    {
         //Get data from service layer into entityList.

        List<JSONObject> entities = new ArrayList<JSONObject>();
        for (Entity n : entityList) {
            JSONObject entity = new JSONObject();
            entity.put("aa", "bb");
            entities.add(entity);
        }
        return new ResponseEntity<Object>(entities, HttpStatus.OK);
    }
}

जैसा कि आप स्प्रिंग बूट वेब का उपयोग कर रहे हैं, जैक्सन निर्भरता निहित है और हमें स्पष्ट रूप से परिभाषित करने की आवश्यकता नहीं है। यदि आप ग्रहण का उपयोग कर रहे हैं तो आप निर्भरता पदानुक्रम टैब में अपने pom.xml में जैक्सन निर्भरता की जांच कर सकते हैं।

और जैसा कि आपने @RestController साथ एनोटेट किया है, स्पष्ट @RestController रूपांतरण करने की आवश्यकता नहीं है। बस एक POJO लौटाएं और जैक्सन के धारावाहिक बनाने वाले को जोंस में बदलने का ख्याल रखा जाएगा। यह @ResponseBody साथ उपयोग @ResponseBody जाने पर @ResponseBody का उपयोग करने के बराबर है। हर नियंत्रक विधि पर @ResponseBody रखने के बजाय हम @RestController को वेनिला @ResponseBody और @ResponseBody बजाय डिफ़ॉल्ट रूप से उस नियंत्रक के सभी संसाधनों पर लागू करते हैं।
इस लिंक को देखें: https://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-responsebody

आपके द्वारा सामना की जा रही समस्या इसलिए है क्योंकि लौटी हुई वस्तु (JSONObject) में कुछ गुणों के लिए गटर नहीं है। और आपका इरादा इस JSONObject को अनुक्रमित करना नहीं है, बल्कि एक POJO को क्रमबद्ध करना है। तो बस POJO लौटाएं।
इस लिंक को देखें: https://.com/a/35822500/5039001

यदि आप एक जरीन क्रमबद्ध स्ट्रिंग वापस करना चाहते हैं, तो बस स्ट्रिंग वापस करें। वसंत इस मामले में JSON कनवर्टर के बजाय StringHttpMessageConverter का उपयोग करेगा।


@RequestMapping("/api/status")
public Map doSomething()
{
    return Collections.singletonMap("status", myService.doSomething());
}

पुनश्च। केवल 1 मान के लिए काम करता है






spring-boot