【问题标题】:Apache CXF wsdl2java InternalError: unresolved referenceApache CXF wsdl2java InternalError: unresolved reference
【发布时间】:2018-03-22 23:14:54
【问题描述】:

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

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

这样,这个错误就解决了(我认为),但现在我又遇到了一个错误

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 站点找到任何信息或文档。

【问题讨论】:

    标签: web-services cxf wsdl2java


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      好吧,正如 B. Leal 建议的那样,我放弃旧的 tmdd.wsdl 并重新创建我的 wsdl 文件,并为我需要数据的每个设备使用单独的文件。

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

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

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

      感谢您的帮助。

      【讨论】:

        【解决方案3】:

        我遇到了同样的问题,我的是在 XSD 中。忘记在类型之前添加命名空间。 tns 和 targetNamespace 是相同的 url。 之前:

        <xs:element name="getRequest" type="Request">
        

        之后

        <xs:element name="getRequest" type="tns:Request">
        

        使用 complexType/simpleType 对所有元素进行简单更改解决了问题。

        【讨论】:

          猜你喜欢
          • 2019-04-26
          • 2011-01-13
          • 1970-01-01
          • 2021-04-26
          • 1970-01-01
          • 1970-01-01
          • 2014-07-10
          • 2013-07-01
          • 2015-06-14
          相关资源
          最近更新 更多