具有重复名称的WSDL - 如何强制Java类名称

时间:2014-10-30 12:59:57

标签: java web-services jaxb wsdl

背景 我们正在开发一个与多个第三方Web服务进行通信的应用程序。 可悲的是,其中一个人使用不良的命名约定定义了一个WSDL文件。 相同的名称通常重用于响应元素,以及它使用的complexType。下面剪切的代码显示了一个这样的例子:

  <s:element name="Reset_PasswordResponse">
    <s:complexType>
      <s:sequence>
        <s:element minOccurs="0" maxOccurs="1" name="Reset_PasswordResult" type="tns:ResetPasswordResponse" />
      </s:sequence>
    </s:complexType>
  </s:element>
  <s:complexType name="ResetPasswordResponse">
    <s:complexContent mixed="false">
      <s:extension base="tns:BaseResponse" />
    </s:complexContent>
  </s:complexType>

我们使用Maven cxf codegen插件(jaxb / jax-ws)将其编译为Java类。为了避免名称冲突,我们以前使用了 -AutoNameResolution 选项。 但是,我们发现这导致了意想不到的结果,在某些机器上 class被重命名为ResetPasswordResponse2.java,而在其他机器上,其他类被重命名。 这使得协作开发变得非常困难,并且让我们对未来感到担忧(如果在某些时候它无法在Jenkins上正确编译呢?)

问题: 我正在寻找一种方法来手动确定翻译/重命名应该如何进行。

  • 我被告知只需更改WSDL中的名称就行不通,因为Java文件中的xml命名注释非常重要。
  • 我也研究了绑定文件或内联绑定语句,但无法使其工作。 http://wiki.netbeans.org/WsdlCustomizer#Class_Customization上的文档似乎暗示名称更改仅适用于“wsdl:portType,wsdl:fault,soap:headerfault和wsdl:server”,这表明我可能正在尝试做一些根本不可能的事情

jaxb / jax-ws是否可以绑定?还有其他选择吗?

1 个答案:

答案 0 :(得分:6)

检查此问题并回答:

  

JAXB Binding for XSD outside WSDL

简而言之,您可以使用所谓的绑定文件来自定义名称。

<jxb:bindings version="2.1" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <jxb:bindings schemaLocation="xsdschema.xsd" node="/xs:schema">
        <jxb:bindings node="xs:complexType[@name='ResetPasswordResponse']">
            <jxb:class name="ResetPasswordResponseType"/>
        </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>

您可能对jaxb:nameXmlTransform感兴趣:

  

Issue with JAXB: nameXmlTransform typeName prefix not working

这将允许您全局自定义类型或元素命名规则:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema" jaxb:version="2.0">
   <jaxb:bindings schemaLocation="schema.xsd" node="/xsd:schema">
      <jaxb:schemaBindings>
         <jaxb:nameXmlTransform>
            <jaxb:typeName suffix="Type"/>
            <jaxb:elementName suffix="Element"/>
         </jaxb:nameXmlTransform>
      </jaxb:schemaBindings>
   </jaxb:bindings>
</jaxb:bindings>

积分转到Blaise Doughan