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

Java 具有名称空间解组的JAXB(使用REST服务中的Jersey),java,jaxb,jersey,Java,Jaxb,Jersey,我试图从Convio的公共api中解压一个简单的xml文档。下面的代码没有任何编译器错误,但也不会产生结果。值为空。如果我从xml文档中删除模式和名称空间项,并从POJO中删除名称空间属性,那么它将正常运行。为了能够使用xsd文档/名称空间,我缺少了什么 我试图解析的XML示例 <?xml version='1.0' encoding='UTF-8'?> <getSingleSignOnTokenResponse xsi:schemaLocation="http://convi

我试图从Convio的公共api中解压一个简单的xml文档。下面的代码没有任何编译器错误,但也不会产生结果。值为空。如果我从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>
现在,我正在使用Jersey来完成实际工作,但由于我无法使用Jersey将其解组,因此我在我的机器上使用静态xml文件手动设置了一个解组器,上面的xml结果如下:

    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过滤器以去除名称空间的其他评论,但是由于我直接通过jersey的REST调用进入,我认为我没有机会这样做。有什么想法吗?

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

@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;
}
如果省略它们,则字段返回“默认”名称空间(即没有名称空间)


这有点令人恼火,但事实就是这样。

您可以添加一个包级别的注释(这是在名为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和名称空间的更多信息,请参阅:


完美!我知道我一定错过了一些非常简单的东西。这有点令人恼火,尤其是在花了半个下午的时间与之抗争之后。谢谢。前缀呢?我怎样才能给出多个名称空间?
@javax.xml.bind.annotation.XmlSchema(
   namespace="http://convio.com/crm/v1.0".
   elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 
package com.convio.crm;