java - 具有重复名称的 WSDL——如何强制使用 Java 类名称

标签 java web-services jaxb wsdl

背景: 我们正在开发一个与多个第 3 方网络服务通信的应用程序。 可悲的是,其中一个使用糟糕的命名约定定义了一个 WSDL 文件。 相同的名称经常被重复用于响应元素,以及它使用的复杂类型。下面的代码片段显示了一个这样的例子:

  <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 代码生成插件 (jaxb/jax-ws) 将其编译为 Java 类。为避免名称冲突,我们以前使用选项 -AutoNameResolution。 然而,我们发现这会导致意想不到的结果,在某些机器上 类重命名为 ResetPasswordResponse2.java,而在其他机器上,other 类重命名。 这使得协作开发变得非常困难,也让我们对 future 感到担忧(如果它在某个时候无法在 Jenkins 上正确编译怎么办?)

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

  • 有人告诉我,简单地更改 WSDL 中的名称是行不通的,因为 Java 文件中的 xml 命名注释很重要。
  • 我也研究过绑定(bind)文件或内联绑定(bind)语句,但无法使其正常工作。 http://wiki.netbeans.org/WsdlCustomizer#Class_Customization 处的文档似乎暗示名称更改只能用于“wsdl:portType、wsdl:fault、soap:headerfault 和 wsdl:server”,这表明我可能正在尝试做一些根本不可能的事情。

jaxb/jax-ws 绑定(bind)是一种可能的解决方案吗?还有其他选择吗?

最佳答案

检查这个问题并回答:

JAXB Binding for XSD outside WSDL

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

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

关于java - 具有重复名称的 WSDL——如何强制使用 Java 类名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26653666/

相关文章:

java - Apache2 和 PHPJAVA 桥

java - 请求参数在 Tomcat 中被丢弃

c# - 从 JQuery 调用的 ASP.Net [WebMethod] 获取更好的错误消息

java - 处理 JAXB 集合

java - java如何使用逻辑运算符检查条件

java - 当外部对象用final声明时,为什么匿名内部类会调用外部对象

java - LibGDX And​​roid : Lag with 25+ sprites despite use of TimeKeeping

asp.net - 如何在 Web 应用程序中对调用 Web 服务的 Windows Mobile 客户端进行身份验证

java - 在对象图中检测到循环。这将导致无限深的 XML

java - 其他语言的 XSD javaType 适配器结果