WSDL问题

时间:2009-12-15 22:06:04

标签: java wsdl netbeans6.8 web-services

我最近一直在研究符合ACORD P& C标准的Web服务,并且遇到了一些麻烦,因为wsimport错误地说它无法解析其中一个xsd文件。 错误消息是:

[ERROR]         Unable to parse "D:\projects\DICACORD\DicAcordQuoteRq.xsd" : Illegal character in opaque part at index 2: D:\projects\DICACORD\DicAcordQuoteRq.xsd

我创建的模式基于ACORD P& C模式(超过23k行),我只包含了公司需要使用的必需元素。我使用XMLSpy创建了模式,并且根据其验证,模式是有效的,但是当我尝试在netbeans 6.8中创建Web服务时,我收到上面的错误消息。

模式在我的开发机器上,根据我在netbeans论坛上可以找到的内容,netbeans将wsdl复制到项目内部的一个目录中,这样当你将它从开发转移到生产时,一切仍然像它应该的那样工作

wsdl如下

<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSpy v2010 -->
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"         xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tns="discoveryinsurance.com/schemas" xmlns:ns="discoveryinsurance.com/schemas/acordRq" xmlns:ns1="discoveryinsurance.com/schemas/acordRs" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="discoveryinsurance.com/schemas">
<wsdl:import namespace="discoveryinsurance.com/schemas/acordRq" location="D:\projects\DICACORD\DicAcordQuoteRq.xsd"/>
<wsdl:import namespace="discoveryinsurance.com/schemas/acordRs" location="D:\projects\DICACORD\DicAcordQuoteRs.xsd"/>
<wsdl:types>
    <xs:schema targetNamespace="discoveryinsurance.com/schemas" elementFormDefault="qualified"/>
</wsdl:types>
<wsdl:message name="NewMessageRequest">
    <wsdl:part name="parameter" element="ns:ACORD"/>
</wsdl:message>
<wsdl:message name="NewMessageResponse">
    <wsdl:part name="parameter" element="ns1:ACORD"/>
</wsdl:message>
<wsdl:portType name="QuotePort">
    <wsdl:operation name="QuoteRequest">
        <wsdl:input name="quoteInput" message="tns:NewMessageRequest"/>
        <wsdl:output name="quoteOutput" message="tns:NewMessageResponse"/>
    </wsdl:operation>
</wsdl:portType>
<wsdl:binding name="AgencyQuoteSOAP" type="tns:QuotePort">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="QuoteRequest">
        <soap:operation soapAction="urn:QuoteRequest" style="document"/>
        <wsdl:input>
            <soap:body use="literal"/>
        </wsdl:input>
        <wsdl:output>
            <soap:body use="literal"/>
        </wsdl:output>
    </wsdl:operation>
</wsdl:binding>
<wsdl:service name="AgencyQuote">
    <wsdl:port name="QuotePort" binding="tns:AgencyQuoteSOAP">
        <soap:address location="http://localhost:8084/DicQuoteSvc/AgencyQuote"/>
    </wsdl:port>
</wsdl:service>

我觉得这与命名空间有关,但我不确定。这也是我第一次尝试以这种方式创建Web服务,因为我认为我会节省一些开发时间。

我尝试使用Google搜索错误消息,我读过的所有内容都指向错误的URI。我认为XMLSpy的验证会捕获这样的错误,但如果这是问题,那么它就无法捕获它。

非常感谢任何帮助,我很乐意提供任何其他所需的信息。

3 个答案:

答案 0 :(得分:7)

关于wsdl:import元素,WSDL 1.1规范says

  

WSDL允许关联命名空间   使用文档位置   进口声明:

<definitions .... >
    <import namespace="uri" location="uri"/> *
</definitions>
     

(...)

URI可能是绝对的或相对的,但您的无效

当然,您可以尝试指定绝对URI,可能使用file://和/或正斜杠。但在你的情况下,我认为你应该把你的XSD放在你的WSDSL旁边并使用相对URI,如下所示:

<wsdl:import namespace="discoveryinsurance.com/schemas/acordRq" location="DicAcordQuoteRq.xsd"/>
<wsdl:import namespace="discoveryinsurance.com/schemas/acordRs" location="DicAcordQuoteRs.xsd"/>

答案 1 :(得分:1)

可能是斜杠(\ vs /),请尝试

D:/projects/DICACORD/DicAcordQuoteRs.xsd

如果不起作用,请尝试

file://D:/projects/DICACORD/DicAcordQuoteRs.xsd

答案 2 :(得分:0)

我能想到的一点是,根据规范,wsdl targetNamespace必须是绝对URI。请参阅wsdl primer的第2.2节。

请参阅有效URI格式的wikipedia