2017-10-11 98 views
1

我試圖用Apache CXF wsdl2java可執行文件(我試過2.7.8和3.2.0版本)生成Web服務的Java源代碼。Apache CXF wsdl2java InternalError:未解決的參考

我的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網站找到任何信息或文檔。

回答

1

那麼,正如B.Leal建議的那樣,我會刪除舊的tmdd.wsdl並重新爲我需要數據的每個設備使用單獨的文件執行我的wsdl文件。

由於大部分工作已經重新完成,我不能100%確定錯誤來自哪裏,但我確信它與舊版wsdl中未使用的某些類型有關正確地在xsd文件中。

我知道這是不是一個很大的幫助,但如果有人落在同樣的錯誤,我想你只有兩種選擇:

  • 重新做你的wsdl文件,像我一樣。 (我推薦這個,比看起來容易)
  • 檢查wsdl中使用的每種類型是否存在於xsd文件中,以及它們是否正確。

感謝您的幫助。

2

首先,您不能假設TMDD wsdl生成良好。我前段時間使用過它,並且有很多錯誤。

我建議您重新創建您自己的TMDD.wsdl文件版本,僅限於您要使用的項目。

試試看,告訴我們你得到了什麼。