2011-11-02 127 views
1

从JSON解组JAXB注释类我有一个具有JAXB和Bean验证注解类,就像下面:使用新泽西州和杰克逊

@XmlType(namespace = "urn:com:company:assessment") 
@XmlRootElement 
public class Assessment 
{ 
    // ... 

    @NotNull 
    @Size(min = 1, 
      message = "Assessment requires at least one address.") 
    @Valid 
    @XmlJavaTypeAdapter(AddressesAdapter.class) 
    public synchronized Set<Address> getAddresses() 
    { 
     return this.addresses; 
    } 

    // ... 
} 

泽西从XML就好了乘警这一类及解组;但是,Jersey无法正确从JSON解组。我在AddressesAdapter类中设置了断点,并注意到在反序列化JSON时从不调用unmarshal()方法。

尽管是否使用自然符号或其他方式配置Jersey,如果我创建了@XmlAnyElement -annated属性,我会获得addresses应该使用适配器解组的元素。

如果我直接用杰克逊和注册其JacksonJaxbJsonProvider供应商,我得到尝试从JSON解组时除外:(JacksonJaxbJsonProvider未列出)

Nov 2, 2011 10:07:41 AM com.sun.jersey.api.client.ClientResponse getEntity 
SEVERE: A message body reader for Java class com.company.Assessment, and Java type class com.company.Assessment, and MIME media type application/json was not found 
Nov 2, 2011 10:07:41 AM com.sun.jersey.api.client.ClientResponse getEntity 
SEVERE: The registered message body readers compatible with the MIME media type are: 
*/* -> 
    com.sun.jersey.core.impl.provider.entity.FormProvider 
    com.sun.jersey.core.impl.provider.entity.StringProvider 
    com.sun.jersey.core.impl.provider.entity.ByteArrayProvider 
    com.sun.jersey.core.impl.provider.entity.FileProvider 
    com.sun.jersey.core.impl.provider.entity.InputStreamProvider 
    com.sun.jersey.core.impl.provider.entity.DataSourceProvider 
    com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General 
    com.sun.jersey.core.impl.provider.entity.ReaderProvider 
    com.sun.jersey.core.impl.provider.entity.DocumentProvider 
    com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader 
    com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader 
    com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader 
    com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General 
    com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General 
    com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General 
    com.sun.jersey.core.impl.provider.entity.EntityHolderReader 

没有人有一个想法,我如何可以将我的JAXB注释类编组为XML和JSON,而无需创建MessageBodyReader s和MessageBodyWriter s?

在此先感谢!

+0

为您做了这项工作? – necromancer

回答

0

将jersey-json添加到您的项目依赖项中。

+0

我有,正如我所提到的,我使用自然符号,映射等来配置它,但它不起作用。我直接用Jackson试了一下,那也不管用。 – alfyboza

0

我想你可能像我昨天那样偶然发现了同样的问题。我被泽西岛的文件弄糊涂了,并不理解所有需要的要求。

我已经创建了一个小的Jersey客户端,它从Rails服务器获取JSON资源并将其解组为POJO,但是我昨天无法使它工作,但今天我成功了!

首先,泽西岛需求文档中缺少一个jar,Jackson XML Compability jar和文档很混乱。我写上http://java.net/jira/browse/JERSEY-803

小巴格报告确保运行程序时,您有以下罐子:

  • 杰克逊核心asl.jar
  • 杰克逊映射器,asl.jar
  • 杰克逊 - jaxrs.jar
  • 杰克逊 - xc.jar
  • jettison.jar
  • 的activation.jar
  • STAX-api.jar中
  • 球衣,json.jar

您还需要JAXB 2.x的支持,但多数民众赞成的Java SE部分6

让我知道这对你的作品如果没有,我可以发布我的JSON客户端代码。