我正在尝试使用自己的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需要什么样的魔法?
解决方法
过了一会儿,我找到了问题的根本原因.我的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.