2012-11-20 7 views
6

मैं वर्तमान में लागू करने हूँ एक वेब एपीआईटिप्पणी करना संसाधन JSON उत्पादन, लेकिन वापस जाने के लिए प्रतिक्रिया हेडर में "पाठ/सादे"

आउटपुट (यदि कोई है) JSON होगा, इसलिए मेरे सभी वर्ग अपेक्षित मीडिया प्रकार से एनोटेट किए गए हैं।

@Produces(MediaType.APPLICATION_JSON) 
public class CustomerResource { 
    ... 
} 

कि जिस तरह से मेरी कक्षाओं स्वचालित रूप से json में तब्दील हो जाता है।

लेकिन ...

माइक्रोसॉफ्ट के कारण, उनके केवल आईई CORS समर्थन करते हैं, यदि अनुरोध/प्रतिक्रिया प्रकार पाठ है/सादेhttp://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

4. Only text/plain is supported for the request's Content-Type header 

तो मैं करने के लिए अपने आवेदन के लिए मजबूर करने की जरूरत है शीर्षलेख में टेक्स्ट/सादा के साथ प्रतिक्रिया दें लेकिन फिर भी मेरी कक्षाओं को जेसन आउटपुट पर पेश करें। मुझे पता है कि मैंने जो सीओआरएस कक्षाएं जोड़ दी हैं वह हेडर सेट कर रही है, लेकिन किसी भी तरह से जो मेरी एनोटेशन द्वारा फिर से लिखी जाती है, भले ही मैं अपने आप से एक और फ़िल्टर जोड़ूं।

+0

एक अच्छा सवाल: Genson के साथ आप इसे उस तरह से कर सकता है! क्या आपको किसी भी ग्राहक को _real_ 'text/plain' के रूप में संसाधन की सेवा करने की आवश्यकता है या क्या आप अच्छे कारणों से झूठ बोलने के साथ रह सकते हैं? :-) –

+0

मैं अच्छे कारण के लिए झूठ बोलने के साथ रह सकता हूं, कि आईई अन्यथा पूरी तरह से कोर का समर्थन नहीं करेगा। मैं उम्मीद करता हूं कि फ्रंटएंड उस प्रतिक्रिया हेडर पर भरोसा न करें, लेकिन यह जानना कि – MatthiasLaug

उत्तर

2

हम, जो लिंक आप इंगित कर रहे हैं वह कहता है कि यह के लिए सत्य है केवल अनुरोध। तो आप केवल टेक्स्ट सादा स्वीकार कर सकते हैं लेकिन जो भी आप चाहते हैं उसे तैयार करने के लिए स्वतंत्र हैं।

संपादित (शायद आप पहले से ही यह किया?) के समान कोड के साथ एक कस्टम responsefilter पंजीकरण के प्रयास करें:

@Provider 
public class HeaderRewriteFilter implements ContainerResponseFilter { 
    @Override 
    public ContainerResponse filter(ContainerRequest request, ContainerResponse response) { 
    response.setResponse(Response 
       .fromResponse(response.getResponse()).header(HttpHeaders.CONTENT_TYPE, "text/plain").build()); 
      return response; 
    } 
} 

हालांकि परिणाम की जांच यह ठीक है अगर प्रतिक्रिया पहले से ही इस हेडर शामिल है सुनिश्चित करने के लिए। अन्यथा आप वर्तमान प्रतिक्रिया को संशोधित करने का प्रयास कर सकते हैं, लेकिन मुझे यकीन नहीं है कि आप एक अपरिवर्तनीय वस्तु हो सकते हैं। और जिस तरह से यह मेरे लिए कम साफ लग रहा है :)

List<Object> contentTypes = response.getHttpHeaders().get(HttpHeaders.CONTENT_TYPE); 
contentTypes.clear(); 
contentTypes.add("text/plain"); 
भी JSON < करने के लिए

> जावा databiding आप जाँच कर सकते हैं Genson पुस्तकालय http://code.google.com/p/genson/, यह जर्सी के साथ अच्छी तरह से एकीकृत करता है। बस वर्गपाथ में जार ड्रॉप और भागो!

संपादित 2 ठीक तो आप अन्य तरीके से करना चाहिए, उपयोग का उत्पादन "पाठ/सादे" और उस प्रकार के लिए के लिए एक json bodywriter परिभाषित करते हैं। नकारात्मकता यह है कि आप केवल जेसन का उत्पादन करने में सक्षम होंगे।

@Provider 
@Produces({ MediaType.TEXT_PLAIN }) 
public class PlainTextJsonConverter extends GensonJsonConverter { 
    public GensonJsonConverter() { 
     super(); 
    } 

    public GensonJsonConverter(@javax.ws.rs.core.Context Providers providers) { 
     super(providers); 
    } 
} 
+0

क्या उम्मीद करनी है ठीक है दूसरा लिंक थोड़ा भ्रामक हो सकता है, लेकिन इसका उल्लेख है कि आपके पास आईई में टेक्स्ट/सादे पर आपके सभी प्रतिक्रियाएं भी होनी चाहिए।मैंने प्रश्नों को ठीक किया, धन्यवाद – MatthiasLaug

+0

@MaththiasLaug मैंने अपना जवाब अपडेट कर लिया है, इसे आजमाएं, इसे – eugen

+0

पर काम करना चाहिए मैंने पीओजेओ को अच्छे परिणामों के साथ स्ट्रिंग करने के लिए [जैक्सन] (http://jackson.codehaus.org/) का उपयोग किया है । जेबॉस 'रीस्टेसी द्वारा कवर के तहत इसका उपयोग किया जाता है। आप इसे कर सकते हैं और प्रतिक्रिया शीर्षलेख में 'टेक्स्ट/सादे' रख सकते हैं। – beeler78

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