【问题标题】:Jersey does not see my MessageBodyReaderJersey 看不到我的 MessageBodyReader
【发布时间】:2011-05-24 14:16:32
【问题描述】:

我正在尝试将球衣与我自己的 json MessageBodyReader/MessageBodyWriter 一起使用(因为我没有在我的域类上使用 @XmlRootElement... 注释)。

@Provider
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public final class MyGsonMessageBodyHandler implements MessageBodyWriter<Object>, MessageBodyReader<Object> {
...
}

Jersey 使用这个类作为 messagebodywriter(因为它在实现的方法 writeTo 中的断点处停止)。但是,它没有将此类视为 messagebodyreader(即使我将此类分解为 messagebodyreader/messagebodywriter 的单独实现,它仍然拒绝使用我的 messagebodyreader)。

测试代码如下(jersey-grizzly):

final Greeting greeting = resource.path("/greeting")
            .queryParam("name", name)
            .accept(MediaType.APPLICATION_JSON)
            .type(MediaType.APPLICATION_JSON)
            .get(Greeting.class);

我得到的错误如下:

A message body reader for Java class test.Greeting, and Java type class test.Greeting, and MIME media type application/json was not found

我想知道编写自己的 MessageBodyReader 需要什么样的魔法?

【问题讨论】:

    标签: java jersey jax-rs


    【解决方案1】:

    过了一会儿,我找到了问题的根本原因。我对 MessageBodyReader/Writer 的实现是好的(而且我可以在 RESTlet 中正常工作),但是如果您使用 JerseyTest,请不要忘记将您的 MessageBodyReader/Writer 添加到它的 ClientConfig:

    /**
     * Creates custom REST client config which is mandatory since we don't use any JSON providers.
     * @return Jersey Client Config with the required classes to read/write in(out)coming data.
     */
    private static ClientConfig createClientConfig() {
        final ClientConfig config = new DefaultClientConfig();
        config.getClasses().add(GsonMessageBodyHandler.class);
        config.getClasses().add(GsonAwareContextResolver.class);
        return config;
    }
    
    /**
     * Public ctor
     * @throws com.sun.jersey.test.framework.spi.container.TestContainerException On error
     */
    public MyRestExposureTest() throws TestContainerException {
        super(new WebAppDescriptor.Builder("my.rest.package")
                .clientConfig(createClientConfig())
                .contextPath("/")
                .build());
    }
    

    否则您的客户端代码将无法读取/写入您的 POJO。

    【讨论】:

    • 我正在使用球衣 1.17,这对我不起作用。客户端配置永远不会被评估。
    【解决方案2】:

    这是我正在使用的,它正在工作(目前使用 Jersey 1.8)。

    public static Client createMyClient() {
        ClientConfig cc = new DefaultClientConfig();
        cc.getClasses().add(MyProviderClass1.class);
        cc.getClasses().add(MyProviderClass2.class);
        cc.getClasses().add(MyProviderClass3.class);
        return Client.create(cc);
    }
    

    【讨论】:

      【解决方案3】:

      我不确定是不是你的情况,但常见的错误是 isReadable 方法的错误实现。

      你实现了吗?
      调试时你会停在那里吗?
      它返回 true 吗?

      【讨论】:

        【解决方案4】:

        在尝试了 Alex 的解决方案后,这终于对我有用了:

        public IntegrationTest() throws TestContainerException {
            super(new LowLevelAppDescriptor.Builder(createResourceConfig())
                          .build());
        }
        
        private static ResourceConfig createResourceConfig() {
            ResourceConfig rc = new PackagesResourceConfig("com.github.joschi.jersey.security.smime");
            rc.getSingletons().add(new EnvelopedWriter());
            rc.getSingletons().add(new SignedWriter());
            return rc;
        }
        

        【讨论】:

          猜你喜欢
          • 2017-04-13
          • 1970-01-01
          • 1970-01-01
          • 2017-08-22
          • 2015-01-28
          • 2013-05-03
          • 1970-01-01
          • 1970-01-01
          • 2022-01-14
          相关资源
          最近更新 更多