【问题标题】:RestEasy - Unable to find MessageBodyReader?RestEasy - 无法找到 MessageBodyReader?
【发布时间】:2013-05-03 10:07:21
【问题描述】:

我编写了一个简单的 RestEasy 客户端代理来执行 iTunes 搜索。它看起来像这样:

@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。知道什么可能导致这样的错误吗?

【问题讨论】:

  • 刚刚试过。我得到了同样的异常。
  • 我做到了。我正在使用 RestEasy 的客户端代理功能。

标签: java json rest exception resteasy


【解决方案1】:

您的类路径中有 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);

【讨论】:

  • 好的,我确保以下 JAR 在我的类路径中:jettison.jar、resteasy-atom-provider.jar、resteasy-jaxb-provider、resteasy-jaxrs.jar、resteasy-jettison-provider .jar 我还添加了@BadgerFish 注释(基于您提供的链接)。现在我得到一个不同的异常:org.jboss.resteasy.plugins.providers.jaxb.JAXBUnmarshalException:找不到媒体类型的 JAXBContextFinder:text/javascript;charset="utf-8" 想法?
  • 问题是内容类型text/javascript。我已经更新了答案
  • text/javascript 正是 Apple 服务返回的内容。我没有任何运气使用“接受”标题来让它返回任何其他内容。我会试一试,看看它是否有效。
  • 在独立环境中使用 RESTeasy API 时,例如在 Wildfly 等 JEE 容器之外,您必须自己添加 Jackson 依赖项。我又一次偶然发现了这个老问题,-)
  • ClientExecutionInterceptor 已弃用,似乎不再起作用
猜你喜欢
  • 2016-02-17
  • 2020-06-09
  • 2015-01-28
  • 2015-09-11
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多