泽西岛看不到我的MessageBodyReader

问题描述

| 我正在尝试将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。     ,这就是我正在使用的并且正在工作(当前使用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);
}
    ,我不确定是否是您的情况,但常见的错误是
isReadable
方法的实现不正确。 你实现了吗? 调试时,您是否停在那里? 它返回true吗?     ,在尝试了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;
}
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...