繁体   English   中英

Apache CXF wsdl2java InternalError:未解决的引用

[英]Apache CXF wsdl2java InternalError: unresolved reference

我正在尝试使用 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>RR</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 站点找到任何信息或文档。

首先,您不能假设TMDD wsdl生成正确。 我前一段时间使用它,并且有很多错误。

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

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

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

由于大多数工作都已重做,因此我无法100%确定错误的出处,但我很确定这与旧的wsdl中使用的某些类型有关,而这些类型在xsd文件中未正确声明。

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

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

感谢帮助。

我有同样的问题,我的是 XSD。忘记在类型之前添加名称空间。 tns 和 targetNamespace 是同一个 url。之前:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM