2015-06-17 5 views
73

मेरा प्रश्न अनिवार्य रूप से this प्रश्न का अनुवर्ती है।स्प्रिंग एमवीसी - आराम नियंत्रक में JSON के रूप में सरल स्ट्रिंग को वापस कैसे करें

@RestController 
public class TestController 
{ 
    @RequestMapping("/getString") 
    public String getString() 
    { 
     return "Hello World"; 
    } 
} 

उपरोक्त में, वसंत प्रतिक्रिया शरीर में "हैलो वर्ल्ड" जोड़ देगा। मैं JSON प्रतिक्रिया के रूप में एक स्ट्रिंग कैसे वापस कर सकता हूं? मैं समझता हूं कि मैं उद्धरण जोड़ सकता हूं, लेकिन यह हैक की तरह अधिक महसूस करता है।

कृपया इस अवधारणा को समझाने में मदद के लिए कोई उदाहरण प्रदान करें।

नोट: मैं इस HTTP प्रतिक्रिया शरीर के लिए सीधे लिखा नहीं करना चाहते, मैं RestyGWT साथ JSON प्रारूप में स्ट्रिंग (मैं अपने नियंत्रक उपयोग कर रहा हूँ वापस जाने के लिए जो जवाब में होने की आवश्यकता है चाहता हूँ वैध JSON प्रारूप)।

+0

आप मानचित्र या किसी ऑब्जेक्ट/इकाई को वापस कर सकते हैं जिसमें आपकी स्ट्रिंग –

+0

है तो आप का मतलब है कि आप स्ट्रिंग मान को JSON स्ट्रिंग में क्रमबद्ध करना चाहते हैं? –

उत्तर

79

या तो लौट (Return only string message from Spring MVC 3 Controller के रूप में) text/plain या अपने स्ट्रिंग लपेटो किसी वस्तु

public class StringResponse { 

    private String response; 

    public StringResponse(String s) { 
     this.response = s; 
    } 

    // get/set omitted... 
} 


application/json

के प्रति आपकी प्रतिक्रिया प्रकार सेट है
@RequestMapping(value = "/getString", method = RequestMethod.GET, produces = "application/json") 

और आप एक JSON कि लगता है कि

{ "response" : "your string value" } 
+67

आप एक रैपर वर्ग बनाने के बिना समान परिणाम प्राप्त करने के लिए 'संग्रह .singletonMap ("प्रतिक्रिया", "अपना स्ट्रिंग मान") वापस भी लौट सकते हैं। –

+0

@ बोहुस्लाव यह एक महान टिप है। – Shaun

+4

यह सच नहीं है कि इसे एक कुंजी और मूल्य की आवश्यकता है। एक स्ट्रिंग या तारों की सरणी दोनों मान्य JSON हैं। यदि आप असहमत हैं तो आप समझा सकते हैं कि जेसनलिंट वेबसाइट उन दोनों को वैध JSON के रूप में क्यों स्वीकार करती है। – KyleM

-2

अपने विधि को यह टिप्पणी जोड़ें कि

@RequestMapping(value = "/getString", method = RequestMethod.GET, produces = "application/json") 
31

JSON अनिवार्य रूप से PHP या जावा संदर्भ में एक स्ट्रिंग है होगा। इसका मतलब है कि स्ट्रिंग जो वैध JSON है प्रतिक्रिया में वापस किया जा सकता है। निम्नलिखित काम करना चाहिए।

@RequestMapping(value="/user/addUser", method=RequestMethod.POST) 
    @ResponseBody 
    public String addUser(@ModelAttribute("user") User user) { 

    if (user != null) { 
     logger.info("Inside addIssuer, adding: " + user.toString()); 
    } else { 
     logger.info("Inside addIssuer..."); 
    } 
    users.put(user.getUsername(), user); 
    return "{\"success\":1}"; 
    } 

यह सरल स्ट्रिंग प्रतिक्रिया के लिए ठीक है। लेकिन जटिल जेएसओएन प्रतिक्रिया के लिए आपको शॉन द्वारा वर्णित रैपर वर्ग का उपयोग करना चाहिए।

+1

इसे उत्तर स्वीकार किया जाना चाहिए, क्योंकि यह ओपी के प्रश्न का सही जवाब था। – SRy

15

चूंकि मैंने यह प्रश्न पोस्ट किया है, इसलिए मैंने JSONObject (मेवेन dependency info) का उपयोग करना शुरू कर दिया है। विशेष रूप से एक टीम के साथ काम करते हुए, मुझे कुछ रैपर ऑब्जेक्ट की बजाय स्ट्रिंग को वापस करने की अपेक्षा करना आसान लगता है जब मैं चाहता हूं कि एक साधारण स्ट्रिंग है।

उदाहरण उपयोग:

@RestController 
public class TestController 
{ 
    @RequestMapping("/getString") 
    public String getString() 
    { 
     return JSONObject.quote("Hello World"); 
    } 
} 
5

आप डिफ़ॉल्ट StringHttpMessageConverter उदाहरण अपंजीकृत:

@Configuration 
public class WebMvcConfiguration extends WebMvcConfigurationSupport { 
    /** 
    * Unregister the default {@link StringHttpMessageConverter} as we want Strings 
    * to be handled by the JSON converter. 
    * 
    * @param converters List of already configured converters 
    * @see WebMvcConfigurationSupport#addDefaultHttpMessageConverters(List) 
    */ 
    @Override 
    protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) { 
    converters.stream() 
     .filter(c -> c instanceof StringHttpMessageConverter) 
     .findFirst().ifPresent(converters::remove); 
    } 
} 

दोनों नियंत्रक कार्रवाई हैंडलर तरीकों और नियंत्रक अपवाद संचालकों के साथ परीक्षण किया गया:

@RequestMapping("/foo") 
public String produceFoo() { 
    return "foo"; 
} 

@ExceptionHandler(FooApiException.class) 
public String fooException(HttpServletRequest request, Throwable e) { 
    return e.getMessage(); 
} 

अंतिम नोट्स:

  • extendMessageConverters वसंत 4.1.3 के बाद से उपलब्ध है, यदि पिछले संस्करण पर चल रहे हैं तो आप configureMessageConverters का उपयोग कर उसी तकनीक को लागू कर सकते हैं, यह थोड़ा और अधिक काम लेता है।
  • यह कई अन्य संभावित दृष्टिकोणों का एक दृष्टिकोण था, यदि आपका एप्लिकेशन केवल जेएसओएन और कोई अन्य सामग्री प्रकार नहीं देता है, तो आप डिफ़ॉल्ट कनवर्टर्स को छोड़कर और एक जैक्सन कनवर्टर जोड़ने से बेहतर होते हैं। एक और तरीका डिफ़ॉल्ट कन्वर्टर्स को जोड़ना है, लेकिन अलग-अलग क्रम में ताकि जैक्सन कनवर्टर स्ट्रिंग से पहले हो। यह नियंत्रक क्रिया विधियों को यह निर्धारित करने की अनुमति दे सकता है कि वे प्रतिक्रिया के मीडिया प्रकार के आधार पर स्ट्रिंग को कैसे परिवर्तित करना चाहते हैं।
+0

आपके दूसरे अंतिम नोट के संबंध में एक उदाहरण कोड होना अच्छा लगेगा। –

3

@RequestMapping एनोटेशन में produces = "application/json" जोड़े की तरह:

@RequestMapping(value = "api/login", method = RequestMethod.GET, produces = "application/json") 

संकेत: आप एक वापसी मान के रूप में, मैं ResponseEntity<List<T>> प्रकार का उपयोग करने की सलाह देते हैं। चूंकि जेएसओएन बॉडी में उत्पादित डेटा सरणी या ऑब्जेक्ट एक विनिर्देशों के अनुसार, एक साधारण स्ट्रिंग के बजाय इसकी विनिर्देशों के अनुसार होना चाहिए। यह कभी-कभी समस्याओं का कारण बन सकता है (उदा। कोणीय 2 में अवलोकन)।

अंतर:

json के रूप में String लौटे: "example"

json के रूप में List<String> लौटे: ["example"]

3

@ResponseBody एनोटेशन, जो उत्पादन धारा में डेटा वापस लिखेंगे जोड़ें।

+0

यह मेरे लिए काम नहीं किया। मेरे पास '@PostMapping (value = "/ some-url" है, = APPLICATION_JSON_UTF8_VALUE का उत्पादन करता है)' – aliopi

9

आप आसानी से JSONString साथ संपत्ति response में

@RestController 
public class TestController { 
    @RequestMapping((value = "/getString", produces = MediaType.APPLICATION_JSON_VALUE) 
    public Map getString() { 
     return Collections.singletonMap("response", "Hello World"); 
    } 
} 
+1

जब भी आप '@RestController' का उपयोग करते हैं, तो आपको '@ResponseBody' का उपयोग करने की आवश्यकता नहीं है –

1

निम्नलिखित वसंत में MVC 4 वस्तुओं के लिए डिफ़ॉल्ट प्रतिक्रिया प्रकार JSON है के रूप में लौट सकते हैं। तो आपको बस कुछ ऑब्जेक्ट में अपनी स्ट्रिंग लपेटना है।

public class StringResponse { 

    private String response; 

    public StringResponse(String s) { 
     this.response = s; 
    } 

    // getters and setters 
} 

नियंत्रक करने के लिए कोई संशोधन, स्ट्रिंग की StringResponse लौटने के बजाय छोड़कर।

संबंधित मुद्दे