2011-05-24 100 views
6

我想用我自己的json MessageBodyReader/MessageBodyWriter(因为我没有在我的域类上使用@XmlRootElement ...标注)使用泽西岛。泽西岛没有看到我的MessageBodyReader

@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)。

测试代码如下(新泽西州灰熊):

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?

回答

0

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

您是否实施过它?
在调试时你停在那里吗?
它是否返回true?

9

经过一段时间,我找到了问题的根本原因。我化MessageBodyReader /写入器的实现是OK(我它正常工作与的Restlet),但是如果你使用JerseyTest,不要忘记添加化MessageBodyReader /作家到它的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。

+0

我使用的球衣1.17,这不适合我的工作。客户端配置永远不会被评估。 – Raffael 2013-10-16 13:42:12

3

这就是我正在使用和它的工作(目前与泽西岛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); 
} 
0

试图亚历克斯”的解决方案之后,这次终于为我工作:

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; 
}