2015-01-20 16 views
5

के साथ JSON marhsalling को अनुकूलित करना हमारे पास एक जैक्स-आरएस एप्लिकेशन है जो अपाचे टॉमई पर चलता है। हम जावास्क्रिप्ट फ्रंटएंड द्वारा उपयोग किए गए जेएसओएन सम्मेलनों का बेहतर पालन करने के लिए डिफ़ॉल्ट जेटीसन प्रदाता को थोड़ा सा अनुकूलित करते हैं। TomEE अपने resources.xml फ़ाइल के माध्यम से यह करने के लिए अनुमति देता है:ग्लासफ़िश v4

<resources> 
    <Service id="jettison" class-name="org.apache.cxf.jaxrs.provider.json.JSONProvider"> 
     serializeAsArray = true 
     dropRootElement = false 
     arrayKeys = members,roles 
     supportUnwrapped = true 
     writeXsiType = false 
    </Service> 
</resources> 

अब हम ग्लासफिश v4.1 की ओर पलायन कर रहे हैं, और हम उस JSON उत्पादन क्या हम TomEE में था से अलग नोटिस - इस प्रकार पूरी तरह से तोड़ने दृश्यपटल। मैं ग्लासफ़िश में JSON marshaller को अनुकूलित करने के लिए समान तंत्र की तलाश में हूं। वास्तव में, मैं जर्सी, मोक्सी, जैक्सन, जेटीसन के साथ पहले से ही थोड़ा सा stuck हूं। हम कैसे जानते हैं कि वास्तव में किस JSON प्रदाता का उपयोग किया जाता है? हम एक का चयन कैसे करते हैं? हम व्यवहार को कैसे अनुकूलित करते हैं?

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

उत्तर

2

ग्लासफ़िश MOXy को डिफ़ॉल्ट प्रदाता के रूप में उपयोग करता है। आंतरिक रूप से में जैक्सन, जेटीसन और मोक्सी को संभालने के लिए पुस्तकालय हैं, लेकिन डिफ़ॉल्ट मोक्सी है। वहाँ MOXY

  1. सेट जर्सी संपत्ति true को jersey.config.server.disableMoxyJson निष्क्रिय करने के लिए दो तरीके हैं।
  2. एक अलग XxxJsonFeature पंजीकृत करें जो MOXy को अक्षम करता है। उदाहरण JacksonFeature उस के साथ jersey-media-json-jackson

नोट आता है कि Glassfish एक जैक्सन प्रदाता के साथ आता है, लेकिन के लिए यह जैक्सन 1.x. है आप के बजाय ऊपर सूचीबद्ध jersey-media-json-jackson निर्भरता का उपयोग कर के, 2.x का उपयोग करना चाहते हैं, तो यह अंतर्निहित जैक्सन प्रदाता निर्भरता, जो है

<dependency> 
    <groupId>com.fasterxml.jackson.jaxrs</groupId> 
    <artifactId>jackson-jaxrs-json-provider</artifactId> 
    <version>2.6.0</version> 
</dependency> 

आप JacksonJsonProvider या JAXB के लिए JacksonJaxbJsonProvider रजिस्टर कर सकते हैं उपयोग करने के लिए बेहतर होगा एनोटेशन समर्थन।

जैक्सन को कॉन्फ़िगर करने के लिए, ContextResolver को लागू करने का सबसे आसान तरीका, जैसा कि this answer में देखा गया है। JacksonJsonProvider (0) क्रमबद्ध करने के लिए उपयोग किए गए ObjectMapper को पुनर्प्राप्त करने के लिए इस ContextResolver को देखेगा।

आपको ऊपर बताए अनुसार MOXy को अक्षम करने की भी आवश्यकता होगी।

यह भी ध्यान में रखना एक बात यह है कि यह समाधान पोर्टेबल है। JAX-रुपये के साथ, केवल पोर्टेबल अनुप्रयोग विन्यास एक Application उपवर्ग

@ApplicationPath("/api") 
public class MyApplication extends Application {} 

कहा जा रहा है के माध्यम से है, Glassfish के मामले में MOXY को निष्क्रिय, एक संपत्ति की स्थापना से ज्यादा कुछ नहीं है। Application कक्षा में, आप getProperties() ओवरराइड कर सकते हैं जो Map<String, Object> देता है। यह वह जगह है जहां आप संपत्ति सेट कर सकते हैं।और क्योंकि यह एक स्ट्रिंग (कोई बाहर निर्भरता) से ज्यादा कुछ नहीं है, यह पोर्टेबल रहता

@ApplicationPath("/api") 
public class MyApplication extends Application { 
    @Override 
    public Map<String, Object> getProperties() { 
     Map<String, Object> props = new HashMap<>(); 
     props.put("jersey.config.server.disableMoxyJson", true); 
     return props; 
    } 
} 

जहां तक ​​जैक्सन निर्भरता से ऊपर है, यह भी एक पोर्टेबल समाधान है। यह कुछ भी नहीं (जेएक्स-आरएस) कार्यान्वयन विशिष्ट है। यह मानक जेएक्स-आरएस एपीआई लागू करता है और उपयोग करता है

+0

'jersey.config.server.disableMoxyJson' के बारे में पता लगाना मुझे एक दिन की तरह ले गया। आखिर में मुझे अपना जीसन प्रदाता काम कर रहा है। धन्यवाद! –