2013-05-09 8 views
5

मैंने आईट्यून्स खोज करने के लिए एक सरल रेस्टसी क्लाइंट प्रॉक्सी लिखा है। ऐसा लगता है:RestEasy - MessageBodyReader को खोजने में असमर्थ?

@Path("/") 
public interface AppleAppStoreLookupClient { 

    /** 
    * Attempts to lookup an apple app store item by its ID 
    * 
    * @param id 
    *   The item ID 
    * @return The app details 
    */ 
    @GET 
    @Path("/lookup") 
    @Produces(value = { "text/javascript" }) 
    public AppleAppDetailsResponse lookupByID(@QueryParam("id") String id); 
} 

मेरा JSON मॉडल वर्ग भी सरल है। असल में, पहली कॉल के लिए मैं चाहता हूं कि "परिणाम गणना" मान, केवल यह सुनिश्चित करने के लिए कि कनेक्टिविटी काम करता है।

@XmlRootElement 
@XmlAccessorType(XmlAccessType.NONE) 
public class AppleAppDetailsResponse implements Serializable { 

    private static final long serialVersionUID = 8881587082097337598L; 

    @XmlElement 
    private int resultCount = -1; 

    ...getters and setters... 

} 

हालांकि, जब मैं एक साधारण परीक्षण चलाने के लिए, मैं निम्नलिखित अपवाद प्राप्त करें:

org.jboss.resteasy.client.ClientResponseFailure: Unable to find a MessageBodyReader of content-type text/javascript;charset="utf-8" and type class net.odyssi.mms.appstore.apple.AppleAppDetailsResponse 
    at org.jboss.resteasy.client.core.BaseClientResponse.createResponseFailure(BaseClientResponse.java:523) 
    at org.jboss.resteasy.client.core.BaseClientResponse.createResponseFailure(BaseClientResponse.java:514) 
    at org.jboss.resteasy.client.core.BaseClientResponse.readFrom(BaseClientResponse.java:415) 
    at org.jboss.resteasy.client.core.BaseClientResponse.getEntity(BaseClientResponse.java:377) 
    at org.jboss.resteasy.client.core.BaseClientResponse.getEntity(BaseClientResponse.java:350) 
    at org.jboss.resteasy.client.core.extractors.BodyEntityExtractor.extractEntity(BodyEntityExtractor.java:62) 
    at org.jboss.resteasy.client.core.ClientInvoker.invoke(ClientInvoker.java:126) 
    at org.jboss.resteasy.client.core.ClientProxy.invoke(ClientProxy.java:88) 
    at $Proxy21.lookupByID(Unknown Source) 
    at net.odyssi.mms.appstore.apple.test.AppleAppStoreLookupClientTest.testLookupByID(AppleAppStoreLookupClientTest.java:50) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

मैं RestEasy 2.3.6 चल रहा हूँ। कोई विचार क्या ऐसी त्रुटि पैदा कर सकता है?

+0

बस ऐसे ही करने की कोशिश की। मुझे वही अपवाद मिलता है। – Shadowman

+0

मैंने किया। मैं RestEasy की क्लाइंट प्रॉक्सी कार्यक्षमता का उपयोग कर रहा हूँ। – Shadowman

उत्तर

8

क्या आपके पास अपने क्लासपाथ पर एक जेसन प्रदाता है? आप Maven का उपयोग कर रहे हैं, तो यह निर्भरता जोड़ने का प्रयास करें:

<dependency> 
    <groupId>org.jboss.resteasy</groupId> 
    <artifactId>resteasy-jettison-provider</artifactId> 
    <version>2.3.6.Final</version> 
</dependency> 

http://docs.jboss.org/resteasy/docs/2.3.6.Final/userguide/html_single/#JAXB_+_JSON_provider

संपादित करें:

आम तौर पर, एक सामग्री प्रकार application/json और नहीं text/javascript का प्रयोग करेंगे। मुझे यकीन नहीं है कि आप text/javascript का उपयोग क्यों कर रहे हैं?

फिर भी, यदि आपका endpoint रिटर्न केवल text/javascript, आप हमेशा Content-Type -header एक इंटरसेप्टर में संशोधित कर सकते हैं:

ResteasyProviderFactory factory = new ResteasyProviderFactory(); 
RegisterBuiltin.register(factory); 
factory.getClientExecutionInterceptorRegistry().register(
    new ClientExecutionInterceptor() { 
     @Override 
     public ClientResponse execute(ClientExecutionContext ctx) throws Exception { 
      ClientResponse response = ctx.proceed(); 
      if("text/javascript".equals(response.getHeaders().getFirst(HttpHeaders.CONTENT_TYPE))){ 
       response.getHeaders().putSingle(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON); 
      } 
      return response; 
     } 
    }); 


ProxyFactory.create(Service.class, URI.create("http://url-to-your-sevice"), new ApacheHttpClient4Executor(), factory); 
+0

ठीक है, मैं यह सुनिश्चित किया कि निम्नलिखित जार मेरी classpath पर थे: jettison.jar, resteasy-परमाणु-provider.jar, resteasy-JAXB-प्रदाता, resteasy-jaxrs.jar, resteasy-बोझ गिराना-provider.jar मैं @BadgerFish एनोटेशन (आपके द्वारा प्रदान किए गए लिंक के आधार पर) भी जोड़ा गया। अब मुझे एक अलग अपवाद मिलता है: org.jboss.resteasy.plugins.providers.jaxb.JAXBUnmarshalException: मीडिया प्रकार के लिए JAXBContextFinder नहीं मिला: टेक्स्ट/जावास्क्रिप्ट; charset = "utf-8" विचार? – Shadowman

+2

समस्या सामग्री प्रकार 'टेक्स्ट/जावास्क्रिप्ट' है। मैंने अपना जवाब – eiden

+1

टेक्स्ट/जावास्क्रिप्ट अपडेट किया है जो ऐप्पल की सेवा देता है। मुझे कुछ भी वापस करने के लिए "स्वीकार करता है" हेडर के साथ कोई भाग्य नहीं खेल रहा है। मैं इसे एक शॉट दूंगा और देख सकता हूं कि यह काम करता है या नहीं। – Shadowman

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