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

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


आप या तो 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);
    }
}

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

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

जैक्सन को डिफ़ॉल्ट रूप से अनुक्रमित करने और ऑब्जेक्ट्स को डीरिएलाइज़ करने के लिए उपयोग करने के कारण आपका वर्तमान दृष्टिकोण काम नहीं करता है। हालाँकि, यह नहीं पता है कि JSONObject को क्रमबद्ध कैसे किया JSONObject । यदि आप एक गतिशील JSON संरचना बनाना चाहते हैं, तो आप उदाहरण के लिए एक Map उपयोग कर सकते हैं:

@GetMapping
public Map<String, String> sayHello() {
    HashMap<String, String> map = new HashMap<>();
    map.put("key", "value");
    map.put("foo", "bar");
    map.put("aa", "bb");
    return map;
}

यह निम्नलिखित JSON प्रतिक्रिया की ओर ले जाएगा:

{ "key": "value", "foo": "bar", "aa": "bb" }

यह थोड़ा सीमित है, क्योंकि बाल वस्तुओं को जोड़ना थोड़ा और मुश्किल हो सकता है। हालांकि, ObjectNode और ArrayNode का उपयोग करके जैक्सन का अपना तंत्र है। इसका उपयोग करने के लिए, आपको अपनी सेवा / नियंत्रक में ObjectMapper को स्वचालित करना होगा। तो आप का उपयोग कर सकते हैं:

@GetMapping
public ObjectNode sayHello() {
    ObjectNode objectNode = mapper.createObjectNode();
    objectNode.put("key", "value");
    objectNode.put("foo", "bar");
    objectNode.put("number", 42);
    return objectNode;
}

यह दृष्टिकोण आपको बाल वस्तुओं, सरणियों को जोड़ने और सभी विभिन्न प्रकारों का उपयोग करने की अनुमति देता है।


जैसा कि आप स्प्रिंग बूट वेब का उपयोग कर रहे हैं, जैक्सन निर्भरता निहित है और हमें स्पष्ट रूप से परिभाषित करने की आवश्यकता नहीं है। यदि आप ग्रहण का उपयोग कर रहे हैं तो आप निर्भरता पदानुक्रम टैब में अपने 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 का उपयोग करेगा।





spring-boot