带名称空间解组的JAXB(使用REST服务中的Jersey)

时间:2010-06-22 22:23:08

标签: java jaxb jersey

我正试图从Convio的公共api解组一个简单的xml文档。我没有使用以下代码获得任何编译器错误,但它也不会产生结果。值为null。如果我从xml文档中删除模式和命名空间项并从POJO中删除命名空间属性,那么它将运行得很好。我缺少什么能够使用xsd文档/命名空间?

我正在尝试解析的XML示例

<?xml version='1.0' encoding='UTF-8'?>
<getSingleSignOnTokenResponse xsi:schemaLocation="http://convio.com/crm/v1.0 http://service.convio.net/xmlschema/crm.public.v1.xsd" xmlns="http://convio.com/crm/v1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <token>abcdefghijklmnopqrstuvwxyz</token>
  <cons_id>0123456789</cons_id>
</getSingleSignOnTokenResponse>

带有注释的POJO:

@XmlRootElement(name = "getSingleSignOnTokenResponse", namespace = "http://convio.com/crm/v1.0")
public class SingleSignOnResponseBean
{
  @XmlElement(name = "token")
  public String token;
  @XmlElement(name = "cons_id")
  public int consId;
}

现在,我正在使用Jersey来完成实际的工作,但由于我无法使用Jersey解组,我在上面的XML结果的机器上使用静态xml文件手动设置了一个unmarshaller:

    JAXBContext jc = JAXBContext.newInstance(new Class[] {org.orgname.utility.convio.sso.api.SingleSignOnResponseBean.class});
    Unmarshaller u = jc.createUnmarshaller();
    SingleSignOnResponseBean bean2 = (SingleSignOnResponseBean) u.unmarshal(new File("C:/token.xml"));
    System.out.println(bean2.token);

这可能非常简单,我只是没有看到为什么如果定义了架构和命名空间元素它将无法工作。我已经看到了一些关于设置某种SAX过滤器去除命名空间的评论,但由于我是通过直接来自泽西的REST调用进来的,所以我不相信我有机会这样做。有什么想法吗?

2 个答案:

答案 0 :(得分:6)

您可以添加包级别注释(这是在名为package-info的类上完成)并指定elementFormDefault =“qualified”,然后您不需要限定每个@XmlElement注释。

@javax.xml.bind.annotation.XmlSchema(
   namespace="http://convio.com/crm/v1.0".
   elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 
package com.convio.crm; 

有关JAXB和命名空间的更多信息,请参阅:

答案 1 :(得分:5)

命名空间不是由绑定类的字段“继承”。您还需要在字段上定义命名空间:

@XmlRootElement(name = "getSingleSignOnTokenResponse", namespace = "http://convio.com/crm/v1.0")
public class SingleSignOnResponseBean
{
  @XmlElement(name = "token", namespace = "http://convio.com/crm/v1.0")
  public String token;
  @XmlElement(name = "cons_id", namespace = "http://convio.com/crm/v1.0")
  public int consId;
}

如果省略它们,则字段将返回“默认”命名空间(即没有命名空间)。

这有点刺激,但就是这样。

相关问题