7

既存のWebサービス「接続」(SOAP)があります。可能であれば、Swingフレームワークを使用せずに呼び出したいと思います。私は、cxf/wsdl2javaツールを使用してJavaファイルを生成する最初の開発に続きました。

userNameとパスワードをJavaオブジェクトから抽出し、SOAPオブジェクトに配置してから、ローカルホストWebサービスに送信したいと思います。

Connectオブジェクトを本文として「direct:start」に送信すると、例外が発生します...

Caused by: java.lang.IllegalArgumentException: Get the wrong parameter size to invoke the out service, Expect size 2, Parameter size 1. Please check if the message body matches the CXFEndpoint POJO Dataformat request.

最初の引数が実際に渡されたConnectオブジェクトのインスタンスであることを確認しました。

クラスの1つに追加の注釈が必要ですか、テスト方法が無効
ですか、それとも従うべき代替パターンがありますか?

public class TestConnectCXF extends CamelTestSupport
{
    @Override
    protected RouteBuilder createRouteBuilder() throws Exception
    {
        return new RouteBuilder()
        {
            String cxfAddressLine = "cxf:http://localhost:8081/nuxeo/webservices/privateadservice?wsdlURL=wsdl/privateadservice.wsdl" //
                    + "&dataFormat=POJO" //
                    + "&serviceClass=com.sandbox.camelfeed.PrivateAdServiceInterface" //
                    + "&serviceName={http://ws.sandboxtest.com/}PrivateAdService" //
                    + "&synchronous=true" //
                    + "&loggingFeatureEnabled=true" //
                    + "&portName={http://ws.sandboxtest.com/}PrivateAdServiceInterfacePort";
            @Override
            public void configure() throws Exception
            {
                from("direct:start").to(cxfAddressLine).to("mock:end");
            }
        };
    }

    @Test
    public void testConnectViaPojo() throws InterruptedException
    {
        Connect connectToServer = new Connect();
        connectToServer.setUserName("FakeUser");
        connectToServer.setPassword("scrubbed");
        template.sendBody("direct:start", connectToServer);
        Thread.sleep(1000);
    }
}

私はラクダとウェブサービスに不慣れなので、役立つポインタがあれば大歓迎です。

追加情報

キャメル2.10、Java1.6を使用

wsdl2javaから生成されたクラス

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "connect", propOrder = {
   "userName",
   "password"
})
public class Connect {

protected String userName;
protected String password;

public String getUserName() {
    return userName;
}

public void setUserName(String value) {
    this.userName = value;
}


public String getPassword() {
    return password;
}

public void setPassword(String value) {
    this.password = value;
}
}

@WebService(targetNamespace = "http://ws.sandboxtest.com/", name = "PrivateAdServiceInterface")
@XmlSeeAlso({ObjectFactory.class})
public interface PrivateAdServiceInterface {

        // Omitted Code relating to other web calls

        @WebResult(name = "return", targetNamespace = "")
        @RequestWrapper(localName = "connect", targetNamespace = "http://ws.sandboxtest.com/", className = "com.sandbox.camelfeed.Connect")
        @WebMethod
        @ResponseWrapper(localName = "connectResponse", targetNamespace = "http://ws.sandboxtest.com/", className = "com.sandbox.camelfeed.ConnectResponse")
        public java.lang.String connect(
            @WebParam(name = "userName", targetNamespace = "")
            java.lang.String userName,
            @WebParam(name = "password", targetNamespace = "")
            java.lang.String password
        ) throws ClientException_Exception;
    }

@XmlRegistry
public class ObjectFactory {
{
    // Omitted other web calls information
      private final static QName _Connect_QNAME = new QName("http://ws.sandboxtest.com/", "connect");

    @XmlElementDecl(namespace = "http://ws.sandboxtest.com/", name = "connect")
    public JAXBElement<Connect> createConnect(Connect value) {
        return new JAXBElement<Connect>(_Connect_QNAME, Connect.class, null, value);
    }

}
4

2 に答える 2

4

私の経験では、Camelには、SOAP Webサービスの呼び出しやREST呼び出しの作成など、CXF、HTTP、HTTP4などのコンポーネントを使用するよりもカスタムプロセッサで実行する方が簡単なことがいくつかあります。

私は通常Springを使用しているため、アウトバウンド呼び出しにはSpring RESTテンプレートまたはJaxWsPortProxyFactoryBean(Webサービス呼び出し用)のいずれかを使用する傾向があります。

JAX-WS呼び出しを使用した例を次に示します。

    public class WebServiceProcessorBean {

    @Autowired
    private JAXWSProxy theProxy;


    public void callWebservice(Exchange exchange) {
        Response response = theProxy.call();

        //Do something with the response and Exchange.
    }
  }

Springアプリケーションコンテキストでの定義:

<bean id="theProxyService" class="org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean">
        <property name="serviceInterface" value="XXX"/>
        <property name="wsdlDocumentUrl" value="http://xxxxx.wsdl"/>
        <property name="namespaceUri" value="xxxx"/>
        <property name="serviceName" value="xxxx"/>
        <property name="portName" value="xxxxx"/>
</bean> 

Springアプリケーションコンテキストで定義されたWebServiceProcessorBeanをbeanRef()DSLメソッドで使用します。

.beanRef("theProxyService", "callWebservice")
于 2012-11-20T15:21:14.343 に答える
0

また、CXFを使用してApacheCamelを掘り下げてみます:)。

スローである例外は、引数の数の問題だと思います。 template.sendBody(what_is_called, input_parameter_s, output_parameter);

出力パラメーターは、おそらくcxfWebサービスの呼び出しからの戻り値です。

于 2012-11-27T13:01:13.367 に答える