当前位置: 首页 > 面试题库 >

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

姚海
2023-03-14
问题内容

我正在尝试从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>

以及带有注释的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文件手动设置了解组器:

    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;
}

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

这有点刺激,但这就是事实。



 类似资料:
  • 问题内容: 这是我的xml,需要将其转换为Java。我用过jaxb 并引发以下异常javax.xml.bind.UnmarshalException:意外元素(uri:“ http://www.ae.com/Event/Load ”,本地:“ Order”)。期望的元素是<{} lm:Order> 这是我的解组代码 订购Pojo班 您能否也帮助我阅读,当前正在读取文件,需要读取为XML Strin

  • 我使用JAXB从SOAP响应中解析xml元素。我已经为xml元素定义了POJO类。我已经测试了没有名称空间和前缀的pojo类,它工作得很好。需求是解析来自SOAPMessage对象的输入

  • 仅当我从 XML 文件内的所有元素中删除“bpmn:”时,此代码才有效,否则它会引发以下异常: javax.xml.bind.UnmarshalException:意外元素(URI:"http://www.omg.org/spec/BPMN/20100524/MODEL",local:"定义") 我试图在不修改XML文件的情况下使其工作。任何帮助将不胜感激。提前致谢 :)

  • 我想使用JAXB来 将xml解组为java对象, 将其封送回xml 并使用名称空间生成完全相同的输出 下面是原始的 XML: 我正在使用以下POJO: 我用于取消/编组的代码: 这实际上不起作用,我甚至无法解组初始xml。但是如果我尝试封送一个POJO,我只在代码中设置字段。我得到以下结果: 我如何摆脱这个ns3前缀?

  • 我有一个简单的xml要解组。但是我在输出中只得到一个空列表。不会引发任何异常。这是一个第三方生成的xml,我需要使这一工作没有任何变化的xml。 XML: 用于动物的POJO豆: 猫咪的POJO豆 非马歇尔代码是: 最后一行给出了空指针异常。 我是否对 BEAN 类中的命名空间执行了操作?我是Jaxb的新手,这个问题现在困扰了我3天!我之前问过这个问题,但无法得到正确的答案,这是一个更准确的问题。

  • 我正在尝试使用JAXB解组一个xml文件。当我使用具有正确名称和命名空间的@XmlElement时,解组工作(例如@XmlElement(name=“name”,namespace=”http://www.test.com")) xml文件(test.xml)的内容: JAXBExample.java的内容是: 内容 包装stackoverflow.problem.jaxb.ns; 如果我取消注释