【问题标题】:Apache CXF parse WSDL Schema xsd:any typeApache CXF 解析 WSDL 模式 xsd:any 类型
【发布时间】:2016-12-22 15:12:19
【问题描述】:

我正在努力为肥皂网络服务的问题找到好的和最通用的解决方案。我需要解决的问题是将 Apache Axis 使用给定的 WSDL 文件生成的代理替换为 Apache CXF 使用 wsdl2java 命令的代理。 但是,当我使用 CXF 生成代理并在 IDE 中打开类时,我意识到我有:

@XmlAnyElement(lax = true)
    protected List<Object> any;

元素作为类字段。这很奇怪。我查看了纯 wsdl,在 complextype 属性之一中有 xsd:any 元素。我一直在寻找问题是什么以及解决它的最佳解决方案。我找到了this。似乎 apache CXF 运行时无法确定元素的实际数据类型。所以我需要用DOM解析器手动解析它。

Apache Axis 生成以下内容:

private org.apache.axis.message.MessageElement[] _any;

标签:

<any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded" />

我的问题是:解决这个问题的最佳方法是什么?我真的需要 DOM 解析器吗?有什么我想念的吗? 谢谢。

【问题讨论】:

    标签: java web-services soap wsdl cxf


    【解决方案1】:

    &lt;xsd:any&gt; 用于在模式中允许任何元素。见this link

    该元素使我们能够使用架构未指定的元素来扩展 XML 文档。

    所以 CXF 的映射是正确的。 JAXB 注释 @XmlAnyElement(lax = true) 意味着对于该字段,如果包含使用 @XmlRootElement@XmlElementDecl 注释的元素,则将使用相应类的实例来填充该字段,否则该元素将被设置为 @ 的实例987654328@。

    查看示例here

    【讨论】:

    • 但是,如果我向服务器发送请求,它会响应我怎么办。然后我需要获取数据并打电话。结果.getAny()。它会给我对象。然后我想调用它的方法,但它是对象。 Axis 将其转换为 MessageElement。我可以调用它的特定方法。在我的实践中,我想重现这个类的一个功能,所以我需要其中的数据。我想将元素转换为 Document 类型。
    • 根据文档,您可以将对象转换为org.w3c.dom.Element,这将允许您访问DOM结构
    • 是的,我在我的问题中提到了它。看来我别无选择。谢谢你试图帮助我。我很感激。
    • 乐于助人。另请参阅我的答案stackoverflow.com/a/38405472/6371459,在第二步中使用 JAXB unmarshaller 将 &lt;any&gt; 元素映射到 Java 对象(用 @XmlRootElement 注释。我不确定你是否可以使用它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多