2014-10-30 66 views
4

背景: 我们正在开发一个与多个第三方Web服务进行通信的应用程序。 不幸的是,其中一个已经使用糟糕的命名约定定义了一个WSDL文件。 相同的名称通常被重复用于响应元素,以及它使用的complexType。下面剪断的代码示出了一个这样的发生,例如:具有重复名称的WSDL - 如何强制Java类名称

<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,而在其他机器上其他类被重命名。 这使得协作开发非常困难,也给了我们的后顾之忧

问题(如果它不能正确的詹金斯在某些时候编译): 我正在寻找一种方式来手动确定翻译/重命名应该如何进行。

  • 我被告知,仅仅更改WSDL中的名称将不起作用,因为Java文件中的xml命名注释非常重要。
  • 我也看着约束力的文件或内联约束性声明,但无法得到它的工作。在http://wiki.netbeans.org/WsdlCustomizer#Class_Customization文档似乎暗示着名称的变化仅适用于“WSDL:端口类型,WSDL:故障,肥皂:headerfault中,和wsdl:服务器”,这表示我可能会尝试做一些事情,是根本不可能的。

jaxb/jax-ws是否可以绑定一个可能的解决方案?还有其他选择吗?

回答

4

检查这个问题,答案是:

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

+0

谢谢你,Lexicore。 事实证明,我的主要问题是在我的外部约束力的文件中定义的命名空间/的schemaLocation。我现在已经设法将 绑定文件正确地绑定到wsdl。 您的第一个类名自定义示例鼓励我再次尝试让该解决方案起作用,并且最终结果的确与您的代码非常相似。 但是,全局重命名的选项也非常有趣,并且可能为其他人避免了很多麻烦(在他们的wsdl的将来版本中存在更多命名冲突或可能会出现更多命名冲突)。 – Michael 2014-10-30 14:44:30

+0

@Michael很高兴帮助。 – lexicore 2014-10-30 16:25:42