我正在尝试将jersey与我自己的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需要什么样的魔术?

最佳答案

一段时间后,我发现了问题的根本原因。我对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。

10-04 21:05