2012-08-29 17 views
18

मैं जैक्सन प्रदाताओं के साथ RestEasy ग्राहक का उपयोग कर रहा हूँ और उपरोक्त त्रुटिसामग्री प्रकार आवेदन/json और प्रकार वर्ग java.lang.String

clientside कोड प्राप्त करने का एक MessageBodyReader खोजने में असमर्थ है:

ClientRequest request = new ClientRequest(url); 
request.accept(MediaType.APPLICATION_JSON); 
ClientResponse<String> response = request.get(String.class); 

if (response.getStatus() != 200) { 
    throw new RuntimeException("Failed : HTTP error code : " + response.getStatus()); 
} 

BufferedReader br = 
    new BufferedReader(new InputStreamReader(new ByteArrayInputStream(response.getEntity().getBytes()))); 

response.getEntity() त्रुटि जा रहा है

Unable to find a MessageBodyReader of content-type application/json and type class java.lang.String 

मेरे सर्वर साइड कोड के नीचे है साथ ClientResponseFailure अपवाद फेंक है:

@GET 
@Path("/{itemId}") 
@Produces(MediaType.APPLICATION_JSON) 
public String item(@PathParam("itemId") String itemId) { 
    //custom code 

    return gson.toJSON(object); 
} 

उत्तर

0

मुझे लगता है कि पीछे की पूरी औचित्य नहीं पता, लेकिन हम ठीक उसी समस्या (कई बार: पी) पर पहुंच जाते हैं और आप TEXT_PLAIN को MediaType बदलने की जरूरत है।

या आप जेएक्स-आरएस को आपके लिए नौकरी भी दे सकते हैं: gson.toJSON (ऑब्जेक्ट) करने के बजाय, ऑब्जेक्ट वापस करें और अपनी विधि हस्ताक्षर को जो भी वर्ग में बदलें। जेएक्स-आरएस (आपके मामले में रीस्टेसी) स्वचालित रूप से जैक्सन को कॉल करेगा (यदि यह ठीक से कॉन्फ़िगर किया गया है) और अपनी ऑब्जेक्ट जेसन को क्रमबद्ध करें। फिर अपने ग्राहक पक्ष पर आप स्ट्रिंग के बजाए उसी कक्षा के लिए अनुरोध करेंगे और सबकुछ स्वयं ही काम करना चाहिए। मैं ClientRequest/Response से विशेष रूप से परिचित नहीं हूं इसलिए यह काम नहीं कर सकता जैसा मैंने कहा था; हम क्लाइंट पक्ष पर रीस्टेसी प्रॉक्सी कार्यक्षमता का उपयोग करते हैं (ProxyFactory देखें)। फिर भी, जेएक्स-आरएस/रीस्टेसी जेसन सीरियलाइज/क्लाइंट साइड पर स्वचालित रूप से deserialize कर सकते हैं तो निश्चित रूप से एक तरीका है।

+0

मुझे इसे ResteasyJacksonProvider को स्पष्ट रूप से पंजीकृत करके काम करने के लिए मिला। RestEasy इसे स्वयं ही करना था, लेकिन मुझे नहीं पता कि यह प्रदाताओं को पंजीकृत क्यों नहीं कर रहा है। मैं बसंत के साथ Resteasy का उपयोग कर रहा हूँ। ResteasyProviderFactory उदाहरण = ResteasyProviderFactory.getInstance(); रजिस्टर Builtin.register (उदाहरण); instance.registerProvider (ResteasyJacksonProvider.class); – user1632803

0

तुम सच में वास्तव में (बजाय मैन्युअल रूप से बुला GSON की) आप के लिए क्रमबद्धता कर बाई-पास JAX-रुपये की भलाई चाहते हैं, का उपयोग StreamingOutput (अर्थात StreamingOutput रूप outputter लपेट, उस वस्तु वापसी)।

6

समस्या वास्तव में उस RestEasy जैक्सन प्रदाता खोजने में असमर्थ है। मैं मैन्युअल रूप से निम्न कोड से यह रजिस्टर करने के लिए किया था:

ResteasyProviderFactory instance=ResteasyProviderFactory.getInstance(); 
    RegisterBuiltin.register(instance); 
    instance.registerProvider(ResteasyJacksonProvider.class); 

सब कुछ इस के साथ ठीक काम कर रहा है। लेकिन मैं अभी भी समाधान से नाखुश हूं क्योंकि रेस्टसी को प्रदाताओं के लिए स्कैन करना और उन्हें स्वचालित रूप से पंजीकृत करना है।

+0

मैं resteasy, jaxrs, resteasy वसंत, नवीनतम करने के लिए जैक्सन पुस्तकालयों अद्यतन करने और उन्हें मूल – user1632803

+0

काम कर गया तुम भी components.xml से एलान के तौर पर प्रदाता रजिस्टर कर सकते हैं: – tkotisis

+1

RESTeasy अपने दम पर कुछ गतिशील वर्ग लोड हो रहा है करता है और यह एक में परेशानी का कारण बनता है ओएसजीआई संदर्भ, जहां आवश्यक वर्ग ओएसजीआई क्लासलोडर द्वारा नहीं मिल सकते हैं। इस मामले में, आवश्यक कक्षाओं को मैन्युअल रूप से जोड़ना समझ में आता है। – Gregor

47

आप अपने Maven पोम के लिए निम्न निर्भरता को जोड़ने का प्रयास कर सकता है।

<dependency> 
    <groupId>org.jboss.resteasy</groupId> 
    <artifactId>resteasy-jackson-provider</artifactId> 
    <version>2.3.4.Final</version> 
    </dependency> 
+0

धन्यवाद! इससे मुझे भी मदद मिली। – sgoldberg

+0

धन्यवाद पुरुषों, आप हल मेरा दिन – emoleumassi

+0

ध्यान दें कि resteasy-जैक्सन-प्रदाता [पदावनत लगता है] (http://docs.jboss.org/resteasy/docs/3.1.0.Final/javadocs/org/jboss/resteasy/plugins /providers/jackson/ResteasyJacksonProvider.html) और वह resteasy-jackson2-प्रदाता नया आर्टिफैक्ट है। –

1

बस META-INF/सेवाओं/javax.ws.rs.ext.Providers फ़ाइल में लाइन org.jboss.resteasy.plugins.providers.jackson.ResteasyJacksonProvider जोड़ने, समस्या का हल।

इस फ़ाइल resteasy-जैक्सन-providers.jar में शामिल किया गया है, लेकिन एक ही फाइल भी, एक और जार, restasy-jaxrs.jar में और एक निष्पादन योग्य जार फ़ाइल के लिए शामिल किया गया है कि इन दोनों जार का उपयोग करें, वे विलय कर दिया नहीं कर रहे हैं !!

+1

धन्यवाद, जो मुझे सही रास्ते पर रखता है। तथ्य की बात के रूप में, यदि आप एक जार में कई जावा घटकों विलय, अलग javax.ws.rs.ext.Providers भी मर्ज करने की आवश्यकता। Gradle छाया प्लगइन उदाहरण एक समारोह mergeServiceFiles कहा जाता है के लिए है, लेकिन यह भी build.gradle में स्पष्ट रूप से कहा जा चुका है: shadowJar { mergeServiceFiles() } – ocroquette

0

मैं एक ऐसी ही समस्या थी और मैंने महसूस किया कि समस्या resteasy-jackson-provider के संस्करण के साथ जुड़ा हुआ था। मैं सिर्फ 3.0.5.Final करने के लिए 3.0.4.Final से चले गए और समस्या गायब हो गया।

साथ ही मैं यह भी महसूस किया कि अगर मैं निम्नलिखित परिणाम के लिए तीसरी लाइन बदलने निर्भरता बदलने की कोई आवश्यकता के साथ की उम्मीद थी।

Response response = request.get(Object.class).toString(); 
0

चीज़ें है कि काम किया था मेरी कोड रहे थे कि मैं कहा:

<dependency> 
    <groupId>org.jboss.resteasy</groupId> 
    <artifactId>resteasy-jackson2-provider</artifactId> 
    <version>&{resteasy.version}</version> 
</dependency> 

इस के अलावा मैं पता नहीं क्यों, लेकिन ऐसा लगता है कि resteasy प्रदाताओं आरंभ नहीं जब ग्राहक बनाए गए थे, इसका मतलब है कि

ResteasyProviderFactory instance=ResteasyProviderFactory.getInstance(); 
RegisterBuiltin.register(instance); 
instance.registerProvider(ResteasyJackson2Provider.class); 

सामान्य तौर पर यह ग्राहक चलाने के लिए पर्याप्त है: यह उन्हें मैन्युअल रूप से init करने के लिए आवश्यक।

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