2

最初にhttp://www.mulesoft.org/documentation/display/current/Consuming+Web+Services+with+CXFガイドに従って CXF を使用してクライアント クラスを生成することにより、サンプル Mule フローを作成しました。

フローは に進むことで開始されlocalhost:8081/testます。は、次のparametersObjectArrayように、任意のメッセージを Web サービス メソッド呼び出しに必要なハードコードされたオブジェクト配列に変換します。

package com.test.example.transformers;

import org.mule.api.transformer.TransformerException;
import org.mule.transformer.AbstractTransformer;

public class GetCustomersArrayTransformer extends AbstractTransformer {

    @Override
    protected Object doTransform(Object src, String enc)
            throws TransformerException {
        Object[] msg = new Object[3];
        msg[0] = 10;
        msg[1] = 0;
        msg[2] = null;

        return msg;
    }    
}

このトランスフォーマーをフローで使用してメッセージをjaxws-clientノードに渡すと、すべてが期待どおりに機能します。

<custom-transformer name="parametersObjectArray" class="com.test.example.transformers.GetCustomersArrayTransformer" doc:name="Java"/>   


<flow name="mulecartFlow" doc:name="mulecartFlow">
    <http:inbound-endpoint exchange-pattern="one-way" host="localhost" port="8081" doc:name="HTTP" path="test"/>
    <transformer ref="parametersObjectArray" doc:name="Java"></transformer>
    <https:outbound-endpoint exchange-pattern="request-response" host="12.34.56.78" port="1234" path="services/SOAP/TestEndpoint" doc:name="HTTP" connector-ref="httpsConnector" method="POST">
        <cxf:jaxws-client clientClass="com.test.TestEndpointService" enableMuleSoapHeaders="true" doc:name="SOAP" operation="getCustomers" port="TestEndpoint" />
    </https:outbound-endpoint>
    <transformer ref="customerInfoTypesToString" doc:name="Transformer Reference"/>
    <logger level="INFO" doc:name="Logger" message="#[message:payload]"/>
</flow>

パラメータが判読可能でタイプセーフであるように、ラッパーオブジェクトを使用したいと思います。

package com.test.example.transformers;

import org.mule.api.transformer.TransformerException;
import org.mule.transformer.AbstractTransformer;

import com.test.GetCustomers;

public class GetCustomersObjectTransformer extends AbstractTransformer {

    @Override
    protected Object doTransform(Object src, String enc)
            throws TransformerException {           
        GetCustomers soapRequest = new GetCustomers();
        soapRequest.setStartIndex(0);
        soapRequest.setMaxBatchSize(1);

        return soapRequest;
    }

}

しかし、それはうまくいかないようです。マニュアルページに次のように記載されていることに気付きました:

注: CXF トランスポートは、ラッパー スタイルの Web サービス メソッド呼び出しをサポートしていません。バインディング ファイルを作成するか、WSDL を直接変更する必要がある場合があります。

どういう意味ですか?すべてのメソッド パラメータをラップするラッパー オブジェクトを Web サービス メソッドに送信するにはどうすればよいですか?

4

1 に答える 1

3

追加:

    <jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws">
        <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>
    </jaxws:bindings>

insidewsdl:portTypeと CXF は、目的のラッパー オブジェクトを生成します。

また、ペイロードを設定するために Java トランスフォーマーを作成するのはやり過ぎであることに注意してくださいset-payload。単純な MEL エクスプレッションを使用すれば十分です。

于 2013-10-07T14:22:24.343 に答える