使用Jersey和Jackson从JSON解组JAXB-Annotated Classes

时间:2011-11-02 15:07:26

标签: java json jaxb jersey jackson

我有一个具有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;
    }

    // ...
}

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

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

如果我直接使用Jackson并注册其JacksonJaxbJsonProvider提供程序,则在尝试从JSON解组时会出现异常:

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

JacksonJaxbJsonProvider未列出。)

有没有人知道如何在不必创建MessageBodyReaderMessageBodyWriter s的情况下将我的JAXB注释类编组为XML和JSON?

提前致谢!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我想你可能偶然发现了和昨天一样的问题。我对Jersey文档感到困惑,并不理解所需的所有要求。

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

首先,Jersey要求文档中缺少一个jar,Jackson XML Compability jar以及文档令人困惑。我在http://java.net/jira/browse/JERSEY-803

上写了一篇小报告

确保在运行程序时有以下jar:

  • 杰克逊 - 芯 - asl.jar
  • 杰克逊映射器-asl.jar
  • 杰克逊jaxrs.jar
  • 杰克逊xc.jar
  • jettison.jar
  • 的activation.jar
  • STAX-api.jar文件
  • 球衣-json.jar

您还需要JAXB 2.x支持,但这是Java SE 6的一部分。

让我知道这是否适合您,如果不是,我可以发布我的JSON客户端代码。