JAXB 自定义与糟糕的 WSDL 格式 [英] JAXB Customizations With a Poorly Formed WSDL

查看:33
本文介绍了JAXB 自定义与糟糕的 WSDL 格式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这让我发疯.我在需要自定义的 WSDL 中嵌入了一个架构,因为 WSIMPORT 抛出以下错误

This is driving me insane. I have a schema embedded within a WSDL that needs customization because WSIMPORT is throwing the following error

[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) 手动修复此命名冲突已不再可接受,因为我需要将存根的构建包含到自动构建链中.

1) I have no control over this WSDL as I am building a WSDL first client and I expect it to go over revisions w/o any formal consultation or release to me. 2) It is not acceptable any longer to manually fix this naming collision because I need to include the construction of stubs into an automated build chain.

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

I must use an external customization file. I just can't seem to figure out how to get the customization to work.

这是有问题的 WSDL 片段:

Here is the offending WSDL fragment:

<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 技能的绝佳机会.任何帮助将不胜感激.

This would be a great chance for you to flex your JAXB skills. Any help would be greatly appreciated.

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

I've been staring at the jaxb documentation for hours and still no luck. I can offer the entire WSDL if need be. Can anyone help?

推荐答案

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

Well this morning I came in to work and was able to figure this out. Sometimes just walking away from the problem and coming back with a fresh head is the best way. Here is the solution that worked for me:

<?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>

我在以下命令中使用带有 wsimport 工具的上述外部绑定文件.

I use the above external binding file with the wsimport tool in the following command.

关于此绑定文件的重要事项:

Important things about this binding file:

  • 使用了 jaxws 绑定的命名空间.这是我让节点选择正常工作的唯一方法
  • 节点选择必须以/xs:complexType 结尾.如果您停止选择元素名称,编译器将产生错误.

  • The namespace for jaxws bindings is used. This is the only way I could get the node selection to work properly
  • The node selection has to end with /xs:complexType. If you stop at selecting the the element name the compiler will generate errors.

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

wsimport -d generated -keep -b ArtesiaExternalBinding.xml ArtesiaWebServices.wsdl

使用的选项:
-d generated 指定输出目录(在本例中为名为generated"的文件夹)
-b ArtesiaExternalBinding.xml 告诉 JAXB 编译器使用绑定文件.
-keep 保留存根(我只是使用存根进行检查)

Options used:
-d generated specifies the output directory (a folder named 'generated' in this case)
-b ArtesiaExternalBinding.xml tells the JAXB compiler to use the binding file.
-keep keep the stubs (i just use the stubs for inspection)

最后,我发现这是最有用的信息:有关 jaxws 自定义的 java.net 文档

finally, I found this to be the most helpful tidbit of information: java.net documents on jaxws customizations

这就是让我在 jaxws 标签中嵌套 jaxb 定制的原因.感谢链接Petru Gardea

This is what lead me to nesting the jaxb customizations within jaxws tags. Thanks for the link Petru Gardea

这篇关于JAXB 自定义与糟糕的 WSDL 格式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆