gpt4 book ai didi

web-services - 带有格式不正确的 WSDL 的 JAXB 自定义

转载 作者:行者123 更新时间:2023-12-04 00:36:23 25 4
gpt4 key购买 nike

这让我发疯。我有一个嵌入在需要自定义的 WSDL 中的模式,因为 WSIMPORT 抛出以下错误

[ERROR] Complex type and its child element share the same name "DomainsMap".
Use a class customization to resolve this conflict.
line 878 of file:/C:/jaxws-ri/bin/ArtesiaWebServices.wsdl

1) 我无法控制此 WSDL,因为我正在构建第一个 WSDL 客户端,并且我希望它能够在没有任何正式咨询或发布给我的情况下进行修订。
2) 手动修复此命名冲突不再可接受,因为我需要将 stub 的构造包含到自动构建链中。

我必须使用外部自定义文件。我似乎无法弄清楚如何让自定义工作。

这是有问题的 WSDL 片段:
<wsdl:definitions>
<wsdl:types>
<xs:schema>
.
.
.
<xs:complexType final="extension restriction" name="domainsMap">
<xs:sequence>
<xs:element name="domainsMap">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="entry">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="key" type="xs:string"/>
<xs:element minOccurs="0" name="value" type="tns:domainValueMap"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>

这将是您发挥 JAXB 技能的绝佳机会。任何帮助将不胜感激。

我已经盯着 jaxb 文档看了好几个小时,但还是没有运气。如果需要,我可以提供整个 WSDL。任何人都可以帮忙吗?

最佳答案

好吧,今天早上我进来工作并能够解决这个问题。有时只是摆脱问题并以新的头脑回来是最好的方法。这是对我有用的解决方案:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<jaxws:bindings
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
wsdlLocation="ArtesiaWebServices.wsdl">

<enableWrapperStyle>true</enableWrapperStyle>
<enableAsyncMapping>false</enableAsyncMapping>
<jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='domainsMap']/xs:sequence/xs:element[@name='domainsMap']/xs:complexType">
<!-- This binding will fix the domainsMap inner element called domainsMap. sheesh, who names stuff like that?! -->
<jaxb:class name="DomainsMapElement"/>
</jaxws:bindings>
<jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema/xs:complexType[@name='domainValueMap']/xs:sequence/xs:element[@name='domainValueMap']/xs:complexType">
<!-- This binding will fix the domainValueMap inner element called domainValueMap. sheesh, who names stuff like that?! -->
<jaxb:class name="DomainValueMapElement"/>
</jaxws:bindings>
</jaxws:bindings>

我在以下命令中将上述外部绑定(bind)文件与 wsimport 工具一起使用。

关于此绑定(bind)文件的重要事项:
  • 使用了 jaxws 绑定(bind)的命名空间。这是让节点选择正常工作的唯一方法
  • 节点选择必须以/xs:complexType 结尾。如果您停止选择元素名称,编译器将生成错误。

    wsimport -d 生成 -keep -b ArtesiaExternalBinding.xml ArtesiaWebServices.wsdl

  • 使用的选项:
    -d 生成指定输出目录(在这种情况下名为“生成”的文件夹)
    -b ArtesiaExternalBinding.xml 告诉 JAXB 编译器使用绑定(bind)文件。
    -保持保留 stub (我只是使用 stub 进行检查)

    最后,我发现这是最有用的信息:
    java.net documents on jaxws customizations

    这就是导致我将 jaxb 自定义嵌套在 jaxws 标记中的原因。感谢链接 Petru Gardea

    关于web-services - 带有格式不正确的 WSDL 的 JAXB 自定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7881883/

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