17

入力メッセージと出力メッセージに同じ要素定義を使用するクライアントの WSDL ファイルを使用していますが、JAX-WS/JAXB で応答を非整列化するのに問題があります。

<wsdl:message name="invokeServiceRequest">
    <wsdl:part element="impl:requests" name="multiRequestWrapper"/>
</wsdl:message>
<wsdl:message name="invokeServiceResponse">
    <wsdl:part element="impl:requests" name="result"/>
</wsdl:message>
<wsdl:portType name="GCGatewayPortType">
    <wsdl:operation name="requests">
        <wsdl:input message="impl:invokeServiceRequest" name="invokeServiceRequest"/>
        <wsdl:output message="impl:invokeServiceResponse" name="invokeServiceResponse"/>
    </wsdl:operation>
</wsdl:portType>

なぜかwsimportで生成されたコードにvoidが返っており、レスポンス受信時にINOUTパラメータが更新されていないようです。

/**
 * This class was generated by the JAX-WS RI.
 * JAX-WS RI 2.1.7-b01-
 * Generated source version: 2.1
 */
...
@WebMethod
@RequestWrapper(localName = "requests", targetNamespace = "http://cg.test.com/", className = "com.test.cg.RequestsType")
@ResponseWrapper(localName = "requests", targetNamespace = "http://cg.test.com/", className = "com.test.cg.RequestsType")
public void requests(
    @WebParam(name = "paramOne", targetNamespace = "http://cg.test.com/", mode = WebParam.Mode.INOUT)
    Holder<String> paramOne,
    @WebParam(name = "paramTwo", targetNamespace = "http://cg.test.com/", mode = WebParam.Mode.INOUT)
    Holder<String> paramTwo,
    @WebParam(name = "requestList", targetNamespace = "http://cg.test.com/", mode = WebParam.Mode.INOUT)
    Holder<List<RequestType>> requestList);

を呼び出すとport.request( paramOne, paramTwo, requestList )、SOAP 要求がサーバーに送信され、有効な SOAP 応答で応答することがわかります。

<soapenv:Envelope ...>
    <soapenv:Header />
    <soapenv:Body>
        <requests ...>
            <paramOne>1</paramOne>
            <paramTwo>2</paramTwo>
            <requestList>
                <!-- various elements that JAXB has generated code for -->

ただし、アプリをデバッグ モードで実行するとRequestType、デバッガー変数ビューで各インスタンスを確認できますRequestsTypeが、<xsd:choice>withRequestDataまたはがあるためResponseData、後者は null であり、RequestDataは指定したとおりです。

私は他のプロジェクトで JAX-WS を正常に使用しましたが、その場合@WebResult、WebResult にちなんで名付けられた void 以外の戻り値の型を持つコードが生成されました。このプロジェクトでは、JAX-WS が要求と応答のタイプが同じであり、同じオブジェクトを再利用できると判断したため、WebResult を取得していないと思います。応答?

4

2 に答える 2

18

ラッピングを無効にするように JAX-WS に指示することで、これを解決できます。これは、JAX-WS バインディング ファイルを介して行われます。

<jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
    <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>
</jaxws:bindings>
于 2014-10-03T12:30:13.680 に答える
14

私はまったく同じ問題を抱えていました。さまざまなタイプ、要素、メッセージ名、操作名などに使用していた名前を試しました。私はついに鍵を見つけました。あなたの質問であなたが言ったことは、実際に私を答えに近づけました:

このプロジェクトでは、JAX-WS が要求と応答のタイプが同じであり、同じオブジェクトを再利用できると判断したため、WebResult を取得していないと思います。応答?

同様の Java コードを生成していた wsdl を調べました (単一のオブジェクト パラメーターではなく、void リターンとパラメーター リストを使用)。しかし、私は異なる入力と出力のタイプを持っています。私の wsdl はあなたのものに似ていましたか?

操作の名前は、入力タイプに定義された要素の名前と同じでした。オペレーション名を「requests」から「processRequests」などに変更するか、オペレーション名をそのままにして、メッセージ定義に使用される要素の名前を変更することをお勧めします。

<wsdl:operation name="requests">

になる

<wsdl:operation name="processRequests">

これがあなたにとってうまくいくかどうか聞いてみたいです。

于 2013-01-23T16:52:09.493 に答える