2012-10-16 15 views
7

मेरे पास एक आरईएसटी एपीआई से एक कोड है जो परिणाम को वापस करने के लिए @ResponseBody का उपयोग करता है, और एक MappingJacksonHttpMessageConverter इसे JSON प्रारूप में वापस करने के लिए उपयोग करता है।वसंत @ResponseBody आदिम प्रकारों के लिए एक अवैध JSON उत्पन्न करता है

यह सभी जटिल वस्तुओं के लिए अच्छी तरह से काम करता है। प्राइमेटिव्स जैसे int, boolean और string मुझे एक JSON मिलता है जो {या [से शुरू नहीं होता है। यह मान्य JSON नहीं है।

मैं सोच रहा था कि इस तरह के एक साधारण प्रकार को वापस करने का सही तरीका क्या है? क्या मुझे इसे किसी ऑब्जेक्ट में { Result : true } जैसे encapsulate करना चाहिए?

धन्यवाद

कोड का नमूना:

@RequestMapping(
     value = "/login", 
     method = RequestMethod.POST) 
@ResponseBody 
public boolean Login(String username, String password) { 
    return authenticationService.authenticate(username, password); 
} 

यह सिर्फ true या false जो में अमान्य JSON है वापस आ जाएगी। इसे किसी ऑब्जेक्ट या सरणी में encapsulated किया जाना चाहिए (अगर मैं सही ढंग से समझता हूं)।

उत्तर

8

यह सिर्फ सच या गलत लौटता है। और आप सही हैं कि जेसन नहीं है।

यह जेसन नहीं हो सकता क्योंकि यह एक वस्तु नहीं है, यह केवल एक आदिम है, इसलिए यह ठीक है - यह आपके सफलता हैंडलर में जावास्क्रिप्ट चर को सौंपा जाएगा।

[true,false,true] 

आप पूरी तरह से json का गठन किया है चाहिए, तो एक आदिम उपयोग नहीं लौटते एक hashmap या कस्टम आवरण वस्तु:

आप Booleans की एक सूची प्रदान यदि आप एक सरणी मिलता है।

{"result":true} 
+0

समस्या चीजें हैं जो एक सही JSON उम्मीद कर रहे हैं कि है। उदाहरण के लिए फ्लेक्स बिल्डर टूल जो फ्लेक्स में आरईएसटी एपीआई कॉल को समाहित करता है, परिणाम जेएसओएन में होने की अपेक्षा करता है। – Oxmane

+0

कस्टम रैपर ऑब्जेक्ट या हैशमैप में डेटा चिपकाएं – NimChimpsky

4

मैं नियंत्रक में तो

public class ObjWrapper<T> implements Serializable { 

    private T obj; 

    public ObjWrapper(T obj) { 
    this.obj = obj; 
    } 

    public T getObj() { 
    return obj; 
    } 

} 

उपयोग करने के लिए सुविधाजनक मिल गया है:

public 
@ResponseBody 
Map<String, Boolean> getTrue() { 
    Map<String, Boolean> map = new HashMap<String, Boolean>(1){{put("result", Boolean.TRUE);}}; 
    return map; 
} 

एक hashmap रिटर्निंग शायद सबसे आसान और सबसे अच्छा तरीका है json आप की आवश्यकता प्राप्त करने के लिए है

@RequestMapping("/getString") @ResponseBody 
public ObjWrapper<String> getString() { ... 

और ग्राहक पर (jQuery)

$.getJson("getString", {}, function (data) { 
      alert(data.obj); 
      }) 

सूची के साथ ही:

public class ListWrapper<T> implements Serializable { 

    private List<T> content; 

    public ListWrapper(T... objects) { 
    content = Arrays.asList(objects); 
    } 

    public ListWrapper(List<T> content) { 
    this.content = content; 
    } 

    public List<T> getContent() { 
    return content; 
    } 

}