【问题标题】:Unmarshal JAXB-Annotated Classes from JSON using Jersey and Jackson使用 Jersey 和 Jackson 从 JSON 解组 JAXB 注释类
【发布时间】:2011-12-20 10:07:07
【问题描述】:

我有一个具有 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 中解组就可以了;但是,Jersey 无法正确解组 JSON。我在 AddressesAdapter 类中设置了断点,并注意到在反序列化 JSON 时永远不会调用 unmarshal() 方法。

不管是否使用自然表示法配置 Jersey,如果我创建一个 @XmlAnyElement-annotated 属性,我会得到应该使用适配器解组的 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 未列出。)

有没有人知道如何将我的 JAXB 注释类编组为 XML 和 JSON,而无需创建 MessageBodyReaders 和 MessageBodyWriters?

提前致谢!

【问题讨论】:

    标签: java json jaxb jersey jackson


    【解决方案1】:

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

    【讨论】:

    • 我有,正如我所提到的,我使用自然符号、映射等对其进行了配置,但它不起作用。我直接用Jackson试过了,也没用。
    【解决方案2】:

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

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

    首先,Jersey 需求文档中缺少一个 jar,Jackson XML Compability jar 和文档也令人困惑。我写了一个关于 http://java.net/jira/browse/JERSEY-803

    的小错误报告

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

    • jackson-core-asl.jar
    • jackson-mapper-asl.jar
    • jackson-jaxrs.jar
    • jackson-xc.jar
    • jettison.jar
    • activation.jar
    • stax-api.jar
    • jersey-json.jar

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

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

    【讨论】:

      猜你喜欢
      • 2012-12-01
      • 2015-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 2018-10-13
      • 1970-01-01
      相关资源
      最近更新 更多