泽西岛没有看到我的MessageBodyReader

时间:2011-05-24 14:16:33

标签: java jersey jax-rs

我正在尝试使用自己的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中的断点处停止)。 Hovewer它没有将这个类视为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需要什么样的魔法?

4 个答案:

答案 0 :(得分:9)

过了一会儿,我找到了问题的根本原因。我的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 :(得分:3)

这就是我正在使用它并且它正在运行(目前使用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);
}

答案 2 :(得分:0)

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

你实施了吗? 你在调试时停在那里吗? 它会回归吗?

答案 3 :(得分:0)

在尝试了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;
}