2

取り組んでいるプロジェクトの WSDL ファイルからソリューションを自動生成しましたが、何らかの理由で、ソリューションが WSDL で指定された入力を正しく処理していないようです。誰かがそれを修正するために私ができることを知っていますか?

次の操作があるとします。

<wsdl:operation name="createBin">
    <wsdl:input message="impl:createBinRequest" name="createBinRequest"/>
    <wsdl:output message="impl:createBinResponse" name="createBinResponse"/>
</wsdl:operation>
<wsdl:message name="createBinRequest">
    <wsdl:part element="impl:createBin" name="parameters"/>
</wsdl:message>
<element name="createBin">
    <complexType>
        <sequence>
            <element name="request" type="impl:Bin"/>
        </sequence>
    </complexType>
</element>
<complexType name="Bin">
    <sequence>
        <element name="FulfillerID" type="xsd:positiveInteger"/>
        <element name="BinID" nillable="true" type="xsd:positiveInteger"/>
        <element name="ExternalLocationID" type="xsd:string"/>
        <element name="BinType" type="xsd:string"/>
        <element name="BinStatus" type="xsd:string"/>
        <element name="Name" nillable="true" type="xsd:string"/>
    </sequence>
</complexType>

このコードで実装されています (Eclipse によって自動生成されます):

public PositiveInteger createBin(Bin request) throws RemoteException {
    throw new UnsupportedOperationException();
}

このメッセージを送信する場合:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://my.api.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <q0:createBin>
            <q0:request>
                <q0:FulfillerID>1234</q0:FulfillerID> 
                <q0:BinID>1234</q0:BinID> 
                <q0:ExternalLocationID>1234</q0:ExternalLocationID> 
                <q0:BinType>Good</q0:BinType> 
                <q0:BinStatus>Bad</q0:BinStatus> 
                <q0:Name>Ugly</q0:Name> 
            </q0:request>
        </q0:createBin>
    </soapenv:Body>
</soapenv:Envelope>

次のエラーが表示されます。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <soapenv:Fault>
            <faultcode>soapenv:Server.userException</faultcode> 
            <faultstring>org.xml.sax.SAXException: Invalid element in com.api.my.Bin - request</faultstring> 
            <detail>
                <ns1:hostname xmlns:ns1="http://xml.apache.org/axis/">localhost</ns1:hostname> 
            </detail>
        </soapenv:Fault>
    </soapenv:Body>
</soapenv:Envelope>

SOAP メッセージが正しい形式であることは 100% 確信しているので、サーバーが何かを詰まらせているに違いありません。パラメータを削除すると、何らかの理由ですべてがスムーズに動作します。

ただし、次のように要素を削除することで、期待される動作を得ることができます。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://my.api.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <soapenv:Body>
        <q0:createBin>
            <q0:FulfillerID>1234</q0:FulfillerID> 
            <q0:BinID>1234</q0:BinID> 
            <q0:ExternalLocationID>1234</q0:ExternalLocationID> 
            <q0:BinType>Good</q0:BinType> 
            <q0:BinStatus>Bad</q0:BinStatus> 
            <q0:Name>Ugly</q0:Name> 
        </q0:createBin>
    </soapenv:Body>
</soapenv:Envelope>
4

2 に答える 2

1

以前にこれを見た場所を思い出すために脳を検索していますが、応答が無効だったために無効であることが判明した、一見「無効な SOAP 要求」を見たことがあると確信しています。

この観点から: 生成された createBin(Bin request) コードを変更して、PositiveIntegerではなくa を返すことができます-3か? おそらく、応答を有効にすることができれば、サーバーは文句を言わなくなります。

幸運を!

于 2013-06-06T16:59:58.460 に答える
0

SAX パーサーが、本来あるべき要求を解釈していないことがわかりました。メソッドへのパラメーターが であっても、それを無視し、タイプのフィールドをrequest持つ要素を解析することを期待しています。を変更することで問題が解決しました。requestcom.api.my.Bin

public PositiveInteger createBin(Bin request) throws RemoteException {
    throw new UnsupportedOperationException();
}

public PositiveInteger createBin(CreateBin request) throws RemoteException {
    throw new UnsupportedOperationException();
}

どこ

public class CreateBin {
    public Bin request;

    /* ... */
}

ただし、透明にするために、無効な何かが原因で全体が爆発しないようにするために、生成された日食CoreServiceSoapBindingStubに多くの微調整を行う必要がありました。CoreServiceSoapBindingSkeleton

于 2013-06-10T21:40:08.333 に答える