2013-05-09 11 views
5

私は、iTunes検索を実行するための単純なRestEasyクライアントプロキシを作成しました。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」値だけです。私はRESTEasyの2.3.6を実行している

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) 

:私は簡単なテストを実行したときに

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

    private static final long serialVersionUID = 8881587082097337598L; 

    @XmlElement 
    private int resultCount = -1; 

    ...getters and setters... 

} 

はしかし、私は次の例外を取得します。このようなエラーを引き起こす原因は何ですか?

+0

はちょうどそれを試してみました。私は同じ例外を得る。 – Shadowman

+0

しました。私はRestEasyのクライアントプロキシ機能を使用しています。 jettison.jar、RESTEasyの原子-provider.jar、RESTEasyの-JAXBプロバイダ、RESTEasyの-jaxrs.jar、RESTEasyの-投棄-provider.jar I: – Shadowman

答えて

8

クラスパスに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

EDIT:

通常、1はコンテンツタイプ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が私のクラスパス上にあったことが確実に@BadgerFishアノテーションも追加しました(あなたが提供したリンクに基づいて)。 org.jboss.resteasy.plugins.providers.jaxb.JAXBUnmarshalException:メディアタイプJAXBContextFinderが見つかりませんでした:text/javascript; charset = "utf-8" 考えられますか? – Shadowman

+2

問題はコンテンツタイプ 'text/javascript'です。私は私の答えを – eiden

+1

更新しましたtext/javascriptはAppleのサービスが返すものです。私は "Accepts"ヘッダーを使って何かを返すことができなかった。私はこれを打ち、それがうまくいくかどうかを見るでしょう。 – Shadowman

関連する問題