Apache CXF wsdl2java InternalError:未解析的引用

时间:2017-10-11 10:10:54

标签: web-services cxf wsdl2java

我正在尝试使用Apache CXF wsdl2java可执行文件为Web服务生成Java源代码(我已经尝试过2.7.8和3.2.0版本)。

我的wsdl文件来自外部代理商(TMDD),所以我假设生成良好

当我第一次尝试生成文件时,会出现“非唯一身体部位”错误:

org.apache.cxf.tools.common.ToolException: Non-unique body parts! In a port, operations must have unique operation signatures on the wire for successful dispatching. In port {http://www.tmdd.org/303/dialogs}tmddOCSoapHttpServicePort, operations "{http://www.tmdd.org/303/dialogs}dlVideoSwitchStatusRequest" and "{http://www.tmdd.org/303/dialogs}dlIntersectionSignalStatusRequest" have the same request body block {http://www.tmdd.org/303/messages}deviceInformationRequestMsg

    at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.validate(WSDLToJavaContainer.java:735)
    at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.processWsdl(WSDLToJavaContainer.java:276)
    at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.execute(WSDLToJavaContainer.java:164)
    at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.execute(WSDLToJavaContainer.java:412)
    at org.apache.cxf.tools.common.toolspec.ToolRunner.runTool(ToolRunner.java:105)
    at org.apache.cxf.tools.wsdlto.WSDLToJava.run(WSDLToJava.java:113)
    at org.apache.cxf.tools.wsdlto.WSDLToJava.run(WSDLToJava.java:86)
    at org.apache.cxf.tools.wsdlto.WSDLToJava.main(WSDLToJava.java:185)

我解决了它在dlVideoSwitchStatusRequest操作中创建一个新的输入消息类型以避免这种情况。我的步骤是:

  1. 创建新消息类型

    <message name="MSG_VideoSwitchStatusRequest"> <part name="message" element="tmdd:videoSwitchStatusRequestMsg"/> </message>

  2. 声明videoSwitchStatusRequestMsg

    <xs:element name="videoSwitchStatusRequestMsg" type="VideoSwitchStatusRequest"> <xs:annotation> <xs:documentation> <objectClass>VideoSwitch</objectClass> <requirement>REQ1109</requirement> </xs:documentation> </xs:annotation> </xs:element>

    这个文件在.xsd文件中定义为与其他操作类似的文件。

  3. 修改该操作的输入类型

    <operation name="dlVideoSwitchStatusRequest">
        <documentation><objectClass>VideoSwitch</objectClass><objectClass>ExternalCenter</objectClass><objectClass>OwnerCenter</objectClass><msgPattern>R-R</msgPattern><requirement>REQ538</requirement></documentation>
        <input message="tns:MSG_VideoSwitchStatusRequest"/>    <!-- This is the new type -->
        <!--<input message="tns:MSG_DeviceInformationRequest"/>  This is the old one --> 
        <output message="tns:MSG_VideoSwitchStatus"/>
        <fault name="errorReport" message="tns:MSG_ErrorReport"/>
    </operation>
    
  4. 有了这个,这个错误就解决了(我想),但现在我又得到了另一个错误

    Exception in thread "main" java.lang.InternalError: unresolved reference
        at com.sun.xml.xsom.impl.parser.DelayedRef._get(DelayedRef.java:103)
        at com.sun.xml.xsom.impl.parser.DelayedRef$Type.getType(DelayedRef.java:148)
        at com.sun.xml.xsom.impl.ElementDecl.getType(ElementDecl.java:110)
        at com.sun.xml.xsom.impl.ElementDecl.updateSubstitutabilityMap(ElementDecl.java:174)
        at com.sun.xml.xsom.impl.parser.ParserContext.getResult(ParserContext.java:141)
        at com.sun.xml.xsom.parser.XSOMParser.getResult(XSOMParser.java:214)
        at com.sun.tools.xjc.ModelLoader.createXSOM(ModelLoader.java:538)
        at com.sun.tools.xjc.api.impl.s2j.SchemaCompilerImpl.bind(SchemaCompilerImpl.java:269)
        at com.sun.tools.xjc.api.impl.s2j.SchemaCompilerImpl.bind(SchemaCompilerImpl.java:95)
        at org.apache.cxf.tools.wsdlto.databinding.jaxb.JAXBDataBinding.initialize(JAXBDataBinding.java:459)
        at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.generateTypes(WSDLToJavaContainer.java:723)
        at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.processWsdl(WSDLToJavaContainer.java:267)
        at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.execute(WSDLToJavaContainer.java:164)
        at org.apache.cxf.tools.wsdlto.WSDLToJavaContainer.execute(WSDLToJavaContainer.java:412)
        at org.apache.cxf.tools.common.toolspec.ToolRunner.runTool(ToolRunner.java:105)
        at org.apache.cxf.tools.wsdlto.WSDLToJava.run(WSDLToJava.java:113)
        at org.apache.cxf.tools.wsdlto.WSDLToJava.run(WSDLToJava.java:86)
        at org.apache.cxf.tools.wsdlto.WSDLToJava.main(WSDLToJava.java:185)
    

    这个太通用了,我没有从Apache网站找到任何信息或文档。

2 个答案:

答案 0 :(得分:1)

首先,你不能假设TMDD wsdl生成良好。我前段时间使用它并且有很多错误。

我建议您重新创建自己的TMDD.wsdl文件版本,仅限于您将要使用的项目。

试试并告诉我们你得到了什么。

答案 1 :(得分:0)

好吧,正如B. Leal建议的那样,我删除了旧的tmdd.wsdl,并为我需要数据的每个设备重新执行wsdl个文件和单独的文件。

由于大部分工作已经重新完成,我不能100%确定错误的来源,但我非常确定它与旧版{{1}中使用的某些类型有关。在wsdl个文件中没有正确声明。

我知道这不是一个很大的帮助,但如果有人遇到同样的错误,我认为你只有两个选择:

  • 像我一样重新执行xsd个文件。 (我推荐这个,它比看起来容易)
  • 检查wsdl文件中是否存在wsdl中使用的每种类型,以及它们是否正确无误。

感谢您的帮助。