当前位置: 首页 > 知识库问答 >
问题:

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

张宣
2023-03-14

背景:我们正在开发一个与多个第三方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 codigen插件(jaxb/jax-ws)来编译Java类。为了避免名称冲突,我们以前使用过选项-AutoName分辨率。然而,我们发现这会导致意想不到的结果,在某些机器上,一个类被重命名为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个答案

寇开畅
2023-03-14

检查以下问题和答案:

WSDL外部XSD的JAXB绑定

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

<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感兴趣:

JAXB: nameXmlTransform typeName前缀不起作用的问题

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

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

信用归布莱斯·道根所有。

 类似资料:
  • 假设您有2个包,并且有名为-Test的公共类。 第一个包。测试 第二包测试 它们中的每一个都有实例变量-x。 在第一种情况下-int x=2; 在第二种情况下-int x=3; 我想导入FirstPackage。在第二个包内测试。测试并打印值为2的x。 我的代码: 但是输出是3。如何打印?

  • 问题内容: 想知道是否有人在使用新功能通过PHP 5.3对类进行命名空间时是否遇到了此问题。 我正在使用单独的类来生成动态类调用,以在应用程序中定义用户类型。基本上,类定义器采用类型的整数表示形式并解释它们,返回一个包含要用作该用户模型的类名的字符串。 我在全局范围内定义了具有该名称的用户类型的对象模型,但是在Editor名称空间中,该用户的编辑器具有另一个名称相同的对象。由于某些原因,PHP不允

  • 输出:类名:包。名称在这里B 有人能告诉我为什么匿名类类型在getClass()方法中给出封闭类吗?这导致了问题的出现。对象C上的equals()始终失败。我的理解是,由于getClass提供了封闭类名,所以永远不会调用重写的equals?

  • 我已经创建了一个类似上面的类,我希望能够使用相同的类使用'colour'作为这个类的替代,如下面。 有没有一种方法可以简单地创造出来?

  • 反射类和方法以及类加载器等都需要使用所谓的“二进制”类名。 类的完全限定名为。然而,要获得类对象,需要编写: 而不是 因为恰好是的内部类。

  • 我想做的是,根据文件名(在代码中以字符串的形式)将编译后的类[lets call it ClassA.class]复制到一个新文件(也定义为ClassA中的字符串)[lets call it ClassB.class],并能够使用“javac ClassB”执行新复制的类(使用新文件名)。 做这件事最好、最简洁的方法是什么? 编辑:工作的解决方案...... 十六进制-编辑文件从ClassA到Cl