2013-05-09 57 views
5

我寫了一個簡單的RestEasy客戶端代理來執行iTunes搜索。它看起來像這樣: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模型類是簡單的,也是如此。實際上,爲了第一次調用,我所需要的只是「resultCount」值,只是爲了確保連接起作用。

@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 2013-05-09 02:16:12

+0

我做到了。我正在使用RestEasy的客戶端代理功能。 – Shadowman 2013-05-09 02:37:01

回答

8

你的classpath上有json提供程序嗎?如果您正在使用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

不管怎麼說,如果您的端點只返回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

好吧,我保證下面的JAR文件是在我的類路徑: jettison.jar,RestEasy的原子基provider.jar,RestEasy的-JAXB提供商,RestEasy的-jaxrs.jar,RestEasy的-拋放,provider.jar 我還添加了@BadgerFish註釋(基於您提供的鏈接)。現在,我得到一個不同的異常: org.jboss.resteasy.plugins.providers.jaxb.JAXBUnmarshalException:找不到JAXBContextFinder媒體類型:文/ JavaScript的;字符集= 「utf-8」 思考? – Shadowman 2013-05-10 01:30:21

+2

問題是內容類型'text/javascript'。我已經更新了我的回答 – eiden 2013-05-10 07:52:16

+1

text/javascript正是Apple的服務所回報的。我沒有任何運氣玩「接受」標題讓它返回其他任何東西。我會給這個鏡頭,看看它是否有效。 – Shadowman 2013-05-10 13:38:01