Web services Apache CXF wsdl2java内部错误:未解析的引用

Web services Apache CXF wsdl2java内部错误:未解析的引用,web-services,cxf,wsdl2java,Web Services,Cxf,Wsdl2java,我尝试使用ApacheCxf wsdl2java可执行文件(我尝试了2.7.8和3.2.0版本)为Web服务生成Java源代码 我的wsdl文件来自一个外部机构(),因此我假设它生成得很好 当我第一次尝试生成文件时,出现“非唯一身体部位”错误: org.apache.cxf.tools.common.ToolException: Non-unique body parts! In a port, operations must have unique operation signatures o

我尝试使用ApacheCxf wsdl2java可执行文件(我尝试了2.7.8和3.2.0版本)为Web服务生成Java源代码

我的wsdl文件来自一个外部机构(),因此我假设它生成得很好

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

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操作中创建了一个新的输入消息类型,从而解决了这个问题。我的步骤是:

  • 创建新的消息类型

    
    

  • 声明videoSwitchStatusRequestMsg

    
    视频交换机
    请求1109
    

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

  • 修改该操作的输入类型

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

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

    首先,您不能假设wsdl生成得很好。我在一段时间前就开始使用它了,而且有很多错误

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


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

    好吧,正如B.Leal所建议的,我删除了旧的
    tmdd.wsdl
    ,然后重新创建我的
    wsdl
    文件,为每个我需要数据的设备创建单独的文件

    由于大多数工作都已重新完成,我不能100%确定该错误来自何处,但我非常确定它与旧的
    wsdl
    中使用的某些类型有关,这些类型在
    xsd
    文件中没有正确声明

    我知道这帮不了大忙,但如果有人犯了同样的错误,我想你只有两个选择:

    • 像我一样,重新创建您的
      wsdl
      文件。(我推荐这一款,它比看上去容易)
    • 检查
      wsdl
      中使用的每个类型是否都存在于
      xsd
      文件中,以及它们是否正确
    谢谢你的帮助

    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)