gpt4 book ai didi

java - 具有 namespace 解码的 JAXB(使用来自 REST 服务的 Jersey)

转载 作者:搜寻专家 更新时间:2023-11-01 01:24:06 25 4
gpt4 key购买 nike

我正在尝试从 Convio 的公共(public) api 中解码一个简单的 xml 文档。我没有收到以下代码的任何编译器错误,但它也不会产生结果。值为空。如果我从 xml 文档中删除模式和 namespace 项并从 POJO 中删除 namespace 属性,那么它将运行得很好。我缺少什么才能使用 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 过滤器以去除命名空间的其他评论,但由于我是通过 REST 调用直接从 jersey 进入的,所以我认为我没有机会这样做。有什么想法吗?

最佳答案

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

关于java - 具有 namespace 解码的 JAXB(使用来自 REST 服务的 Jersey),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3097595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com