2012-10-03 12 views
35

में शून्य वस्तुओं को हटाने के लिए कॉन्फ़िगर कैसे करें मेरे पास एक वसंत webservice है जो एक जेसन प्रतिक्रिया देता है। http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/वसंत आरईएसटी सेवा: जेसन प्रतिक्रिया

प्रारूप json में दिया जाता है है:: मैं सेवा बनाने के लिए उदाहरण यहां दिए गए का उपयोग कर रहा { "नाम": अशक्त, "staffName": [ "KFC-कंपर", "स्मिथ" ]}

मैं वापस आ प्रतिक्रिया से किसी भी अशक्त वस्तुओं को हटाने के लिए चाहते हैं तो यह इस तरह दिखता है: { "staffName": [ "KFC-कंपर", "स्मिथ"]}

मैं इसी तरह मिल गया है यहां पूछे गए प्रश्न लेकिन मैं समाधान समाधान करने में सक्षम हूं उदाहरण के लिए

Configuring ObjectMapper in Spring

How to configure MappingJacksonHttpMessageConverter while using spring annotation-based configuration?

configuring the jacksonObjectMapper not working in spring mvc 3

how to configure spring mvc 3 to not return "null" object in json response?

Spring configure @ResponseBody JSON format

Jackson+Spring3.0.5 custom object mapper

इन और अन्य स्रोतों के माध्यम से पढ़ने से, मैंने स्प्रिंग 3.1 और संदेश-कन्वर्टर्स का उपयोग करने के लिए जो चाहता था उसे हासिल करने का सबसे साफ तरीका पाया जिसे एमवीसी-एनोटेशन के भीतर कॉन्फ़िगर किया जा सकता है। मेरे अद्यतन वसंत कॉन्फ़िग फ़ाइल है:

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans  
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.1.xsd 
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd"> 

<context:component-scan base-package="com.mkyong.common.controller" /> 

<mvc:annotation-driven> 
    <mvc:message-converters> 
     <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
      <property name="prefixJson" value="true" /> 
      <property name="supportedMediaTypes" value="application/json" /> 
      <property name="objectMapper"> 
       <bean class="org.codehaus.jackson.map.ObjectMapper"> 
        <property name="serializationInclusion" value="NON_NULL"/> 
       </bean> 
      </property> 
     </bean> 
    </mvc:message-converters> 
</mvc:annotation-driven> 

सेवा वर्ग, mkyong.com साइट पर दिए गए के रूप में ही है, सिवाय इसके कि मैं दुकान नाम चर की टिप्पणी की है, तो यह

यानी अशक्त है
@Controller 
@RequestMapping("/kfc/brands") 
public class JSONController { 
    @RequestMapping(value="{name}", method = RequestMethod.GET) 
    @ResponseStatus(HttpStatus.OK) 
    public @ResponseBody Shop getShopInJSON(@PathVariable String name) { 
     Shop shop = new Shop(); 
     //shop.setName(name); 
     shop.setStaffName(new String[]{name, "cronin"}); 
     return shop; 
    } 
} 

जैक्सन जार जो मैं उपयोग कर रहा हूं वे जैक्सन-मैपर-एएसएल 1.9.0 और जैक्सन-कोर-एएसएल 1.9.0 हैं। ये एकमात्र नए जार हैं जिन्हें मैंने पोम में जोड़ा है जैसा कि मैंने वसंत-जेसन परियोजना के हिस्से के रूप में प्रदान किया है जिसे मैंने mkyong.com से डाउनलोड किया था।

परियोजना को सफलतापूर्वक बनाता है, लेकिन जब मैं ब्राउज़र के माध्यम से सेवा शुरू मैं अभी भी एक ही बात मिलता है यानी { "नाम": अशक्त, "staffName": [ "KFC-कंपर", "स्मिथ"]}

क्या कोई मुझे बता सकता है कि मैं अपनी कॉन्फ़िगरेशन के साथ गलत कहां जा रहा हूं?

मैंने कई अन्य विकल्पों की कोशिश की है, लेकिन एकमात्र तरीका है कि मैं सही प्रारूप में जेसन को वापस करने में सक्षम हूं, जेएसओएन नियंत्रक को ऑब्जेक्ट मैपर जोड़ना है और "getShopInJSON" विधि एक स्ट्रिंग यानी

public @ResponseBody String getShopInJSON(@PathVariable String name) throws JsonGenerationException, JsonMappingException, IOException { 
    ObjectMapper mapper = new ObjectMapper(); 
    mapper.setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL); 

    Shop shop = new Shop(); 
    //shop.setName(name); 
    shop.setStaffName(new String[]{name, "cronin"}); 
    String test = mapper.writeValueAsString(shop); 
    return test; 
} 

अब अगर मैं सेवा मैं यानी की उम्मीद करने के आह्वान { "staffName": [ "KFC-कंपर", "क्रोनिन"]}

मैं भी प्राप्त कर लिया है यह काम करने के लिए @JsonIgnore एनोटेशन का उपयोग करके, लेकिन यह समाधान मेरे लिए उपयुक्त नहीं है।

मुझे समझ में नहीं आता कि यह कोड में क्यों काम कर रहा है लेकिन कॉन्फ़िगरेशन में नहीं, इसलिए कोई भी मदद शानदार होगी।

+1

मुझे यह वसंत लग रहा था नक्शाकार उद्देश्य यह है कि contex फाइल में परिभाषित का उपयोग नहीं कर रहा है के लिए, मैं डिबग वसंत के साथ की जाँच xml – Elbek

+1

हां में परिभाषित मैपर ऑब्जेक्ट के लिए 'setSerializationInclusion() 'विधि को कॉल कर रहा है, इस तरह मैं इसे समझता हूं। ऑब्जेक्ट मैपर सही ढंग से कॉन्फ़िगर किया गया प्रतीत होता है, यह बस वसंत कंटेनर में उपयोग नहीं किया जा रहा है। – mikec

उत्तर

1

मुझे वसंत कंटेनर को कॉन्फ़िगर करने के माध्यम से एक समाधान मिला है, लेकिन यह अभी भी वही नहीं है जो मैं चाहता था।

मैं वसंत 3.0.5, हटा दिया करने के लिए वापस लुढ़का हुआ है और मैं अपने कॉन्फ़िग फ़ाइल बदल यह जगह है में:

<bean 
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <bean 
       class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
       <property name="objectMapper" ref="jacksonObjectMapper" /> 
      </bean> 
     </list> 
    </property> 
</bean> 


<bean id="jacksonObjectMapper" class="org.codehaus.jackson.map.ObjectMapper" /> 
<bean id="jacksonSerializationConfig" class="org.codehaus.jackson.map.SerializationConfig" 
    factory-bean="jacksonObjectMapper" factory-method="getSerializationConfig" /> 
<bean 
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="targetObject" ref="jacksonSerializationConfig" /> 
    <property name="targetMethod" value="setSerializationInclusion" /> 
    <property name="arguments"> 
     <list> 
      <value type="org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion">NON_NULL</value> 
     </list> 
    </property> 
</bean> 

यह निश्चित रूप से जैसे अन्य प्रश्न में दिए गए प्रतिक्रियाओं के समान है एनोटेशन चालित और AnnotationMethodHandlerAdapter उसी संदर्भ में नहीं किया जा सकता:

configuring the jacksonObjectMapper not working in spring mvc 3

नोट करना महत्वपूर्ण बात यह है कि MVC है।

मैं अभी भी स्प्रिंग 3.1 और एमवीसी के साथ काम करने में असमर्थ हूं: एनोटेशन-संचालित हालांकि। एक समाधान जो एमवीसी का उपयोग करता है: एनोटेशन-संचालित और इसके साथ होने वाले सभी लाभ मुझे लगता है कि यह बेहतर होगा। अगर कोई मुझे दिखा सकता है कि यह कैसे करना है, तो यह बहुत अच्छा होगा।

1

आप जैक्सन के पुराने संस्करणों के लिए JsonWriteNullProperties का उपयोग कर सकते हैं।

जैक्सन के लिए 1.9+, JsonSerialize.include का उपयोग करें।

5

आप जैक्सन 2 का उपयोग कर रहे हैं, तो संदेश-कन्वर्टर्स टैग है:

<mvc:annotation-driven> 
    <mvc:message-converters> 
     <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
      <property name="prefixJson" value="true"/> 
      <property name="supportedMediaTypes" value="application/json"/> 
      <property name="objectMapper"> 
       <bean class="com.fasterxml.jackson.databind.ObjectMapper"> 
        <property name="serializationInclusion" value="NON_NULL"/> 
       </bean> 
      </property> 
     </bean> 
    </mvc:message-converters> 
</mvc:annotation-driven> 
50

जैक्सन 2.0 जब से तुम JsonInclude

@JsonInclude(Include.NON_NULL) 
public class Shop { 
    //... 
} 
2

उपयोग कर सकते हैं संस्करण 1.6 के बाद से हम टिप्पणियों के लिए नए JsonSerialize है (संस्करण में उदाहरण के लिए 1.9.9)।

उदाहरण:

@JsonSerialize(include=Inclusion.NON_NULL) 
public class Test{ 
... 
} 

डिफ़ॉल्ट मूल्य हमेशा होता है।

पुराने संस्करणों में आप JsonWriteNullProperties का उपयोग कर सकते हैं, जो नए संस्करणों में बहिष्कृत है। उदाहरण:

@JsonWriteNullProperties(false) 
public class Test{ 
    ... 
} 
+0

'' @JsonSerialize (शामिल = समावेशन.NON_NULL) '' – cheloncio

5

जैक्सन 2.0 के रूप में, @JsonSerialize(include = xxx)@JsonInclude

3

के पक्ष में पदावनत किया गया है सभी के लिए आप गैर एक्सएमएल config लोगों:

ObjectMapper objMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL); 
HttpMessageConverter msgConverter = new MappingJackson2HttpMessageConverter(objMapper); 
restTemplate.setMessageConverters(Collections.singletonList(msgConverter)); 
2
@JsonSerialize(include=JsonSerialize.Inclusion.NON_EMPTY) 
public class Shop { 
    //... 
} 

हो जाएगा ताकि खाली और शून्य दोनों वस्तुओं को हटाएं

19

चूंकि जैक्सन का उपयोग किया जा रहा है, इसलिए आपको इसे जैक्सन संपत्ति के रूप में कॉन्फ़िगर करना होगा।स्प्रिंग बूट बाकी सेवाओं के मामले में, आप application.properties में यह कॉन्फ़िगर करने के लिए है:

spring.jackson.default-property-inclusion=NON_NULL 

source

+2

दुर्भाग्य से बहिष्कृत, एक मॉडरेटर ने मेरा जवाब हटा दिया कि उन दोहराए गए प्रश्न थे। लेकिन वह एक पाइथन लड़का है और शायद यह नहीं देख सकता कि वे अलग-अलग जावा स्प्रिंग प्रश्न थे (स्प्रिंग एमवीसी के लिए एक, स्प्रिंग आरईएसटी के लिए दूसरा)। उन्होंने सबसे महत्वपूर्ण सवाल में से एक को हटा दिया। बीटीडब्ल्यू, टेलर करने का कोई तरीका नहीं है। जवाब वही हैं। पुस्तकालय वही है (जैक्सन)। मैं समुदाय की मदद करने के लिए फिर कोशिश करूंगा। –

+12

संपत्ति का नाम बदल गया है 'spring.jackson.default-property-include = NON_NULL'। ठीक काम करता है! – Miguel