2013-05-09 56 views
5

Tôi đã viết một proxy máy khách RestEasy đơn giản để thực hiện tìm kiếm trên iTunes. Có vẻ như sau:RestEasy - Không thể tìm thấy 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); 
} 

Lớp mô hình JSON của tôi cũng đơn giản. Trong thực tế, đối với cuộc gọi đầu tiên, tất cả những gì tôi muốn là giá trị "resultCount", chỉ để đảm bảo kết nối hoạt động.

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

    private static final long serialVersionUID = 8881587082097337598L; 

    @XmlElement 
    private int resultCount = -1; 

    ...getters and setters... 

} 

Tuy nhiên, khi tôi chạy một thử nghiệm đơn giản, tôi nhận được ngoại lệ sau đây:

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) 

Tôi đang chạy RestEasy 2.3.6. Bất kỳ ý tưởng gì có thể gây ra lỗi như vậy?

+0

Chỉ cần cố gắng đó. Tôi nhận được cùng một ngoại lệ. – Shadowman

+0

Tôi đã làm. Tôi đang sử dụng chức năng proxy máy khách của RestEasy. – Shadowman

Trả lời

8

Bạn có nhà cung cấp dịch vụ json trên đường dẫn lớp học của bạn không? Nếu bạn đang sử dụng maven, hãy thử thêm sự phụ thuộc này:

<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:

Thông thường, người ta sẽ sử dụng các loại nội dung application/json và không text/javascript. Tôi không chắc tại sao bạn đang sử dụng text/javascript?

Anyways, nếu lợi nhuận endpoint của bạn chỉ text/javascript, bạn luôn có thể thay đổi Content-Type -header trong một đánh chặn:

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

Được rồi, tôi đảm bảo rằng các JAR sau đây có trên đường dẫn lớp của tôi: jettison.jar, resteasy-atom-provider.jar, resteasy-jaxb-provider, resteasy-jaxrs.jar, resteasy-jettison-provider.jar I cũng đã thêm chú thích @BadgerFish (dựa trên liên kết bạn đã cung cấp). Bây giờ tôi nhận được Ngoại lệ khác: org.jboss.resteasy.plugins.providers.jaxb.JAXBUnmarshalException: Không thể tìm thấy JAXBContextFinder cho loại phương tiện: text/javascript; charset = "utf-8" Suy nghĩ? – Shadowman

+2

Vấn đề là loại nội dung 'text/javascript'. Tôi đã cập nhật câu trả lời của tôi – eiden

+1

văn bản/javascript chỉ là những gì dịch vụ của Apple trả về. Tôi đã không có bất kỳ may mắn chơi với tiêu đề "Chấp nhận" để có được nó để trả lại bất cứ điều gì khác. Tôi sẽ cung cấp cho một shot và xem nếu nó hoạt động. – Shadowman

Các vấn đề liên quan