1

キャメルからウェブサービスに電話したいのですが。しかし、サービスを呼び出すたびにnullを受け取ります。解決策を見つけるのを手伝ってくれませんか。

このサービスはtomcatで実行されており、soapUIでテストできます。これがSoapUIからのリクエストです。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"     xmlns:hel="http://helloworld.localhost">
    <soapenv:Header/>
       <soapenv:Body>
          <hel:HelloWorldRequest>
               <hel:input>Pavel</hel:input>
          </hel:HelloWorldRequest>
       </soapenv:Body>
    </soapenv:Envelope>

応答はHelloPavelを返します。CamelInActionガイドに従って、コントラクトファーストWebサービスを作成しました。ファイルを読み取ってWebサービスに送信するルートを実行できます。

ルートのコードは次のとおりです。

public class FileToWsRoute extends RouteBuilder {
public void configure() { 
    from("file://src/data?noop=false")
    .process(new FileProcessor())
    .to("cxf:bean:helloWorld");
    }

}

FileProcessorクラスは次のようになります。

public class FileProcessor implements Processor {

public void process(Exchange exchange) throws Exception {

    System.out.println("We just downloaded: " 
            + exchange.getIn().getHeader("CamelFileName"));
    String text = 
    "<?xml version='1.0' ?>" 
    +"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:hel=\"http://helloworld.localhost\">"
    +"<soapenv:Header/>"
    +   "<soapenv:Body>"
    +     " <hel:HelloWorldRequest>"
    +        " <hel:input>WhatsUP</hel:input>"
    +     " </hel:HelloWorldRequest>"
    +   "</soapenv:Body>"
    +"</soapenv:Envelope>";

    exchange.getIn().setBody(text);
}
}

次のバージョンでは、cxf-codegen-pluginによって生成されたオブジェクト(HalloWorld.java、HelloWorldImpl.java、HelloWorldRequest.java、HelloWorldResponse.java、HelloWorldService.java、ObjectFactory.java、package-info.java)を介してリクエストを生成したいと思います。 )。

camel-cxf.xmlには、次のものがあります。

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:cxf="http://camel.apache.org/schema/cxf"
   xsi:schemaLocation="
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://camel.apache.org/schema/cxf 
     http://camel.apache.org/schema/cxf/camel-cxf.xsd">

  <import resource="classpath:META-INF/cxf/cxf.xml"/>
  <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
  <import resource="classpath:META-INF/cxf/cxf-extension-http-jetty.xml"/>

  <cxf:cxfEndpoint id="helloWorld"
               address="http://localhost:8080/ode/processes/HelloWorld"
               serviceClass="localhost.helloworld.HelloWorld"
               wsdlURL="wsdl/HelloWorld.wsdl"/>
</beans>

Webサービスからの応答を読み取るために、このルートを使用しています。

public class WsToQueueRoute extends RouteBuilder {
    public void configure() { 
    from("cxf:bean:helloWorld")
    .to("seda:incomingOrders")
    .transform().constant("OK");
    }

}

最後のルートはsedaからデータを取得します...

public class QueueToProcessRoute extends RouteBuilder {
public void configure() { 
    from("seda:incomingOrders")
    .process(new PrintResult());
    }

}

...そして結果を出力します。

public class PrintResult implements Processor {

public void process(Exchange exchange) throws Exception {

    System.out.println("Data received: " 
            + exchange.getIn().getBody(String.class));
}

}

実行からの出力は次のとおりです。受信したデータ:null

cxfオブジェクトで解析できるXMLファイルが必要です。問題を見つけるのを手伝ってくれませんか。

ありがとうございました

パベル

4

2 に答える 2

3

この例の問題は、クラス FileProcessor と PrintResult にありました。また、例を簡略化したので、現時点では FileToWsRoute のルートを 1 つだけ使用しています。

public class FileToWsRoute extends RouteBuilder {
public void configure() { 
    from("file://src/data?noop=true")
    .process(new FileProcessor())
    .to("cxf:bean:helloWorld")
    .process(new PrintResult());
    }
}

FileProcessor はこれに変更されました。

public class FileProcessor implements Processor {

public void process(Exchange exchange) throws Exception {
        HelloWorldRequest hs = new HelloWorldRequest();
        hs.setInput("Pavel");
        exchange.getOut().setBody(hs);
    }
}  

PrintProcessor はこれに変更されました。

public class PrintResult implements Processor {
public void process(Exchange exchange) throws Exception {
    MessageContentsList msgList = (MessageContentsList) exchange.getIn().getBody();
    HelloWorldResponse resp = (HelloWorldResponse) msgList.get(0);
    String result = resp.getResult();       
       System.out.println("Data received: " + result);
    }

}

これは、ラクダや Web サービスに苦労している他の人にとって良い例だと思います。

于 2012-11-02T12:43:12.123 に答える
0

メソッドに送信されるデータ形式に問題がある可能性がありますprocess。私が試みることはcamel cxf、次のようにエンドポイントにプロパティを追加することです:

<cxf:properties>
    <entry key="dataFormat" value="POJO"/> 
</cxf:properties>

dataformat を に変更するとPOJO、メッセージが表示されます。したがって、camel cxfエンドポイントは次のようになります。

  <cxf:cxfEndpoint id="helloWorld"
               address="http://localhost:8080/ode/processes/HelloWorld"
               serviceClass="localhost.helloworld.HelloWorld"
               wsdlURL="wsdl/HelloWorld.wsdl">
    <cxf:properties>
        <entry key="dataFormat" value="POJO"/> 
    </cxf:properties>
  </cxf:cxfEndpoint>

私はかつて同様の問題を抱えていましたが、これで問題は解決しましたが、SpringJavaクラスではなくすべてキャメルを使用していました。

これがうまくいかない場合は、次?dataFormat=POJOのように parameter: をルートに追加してみてください:

from("cxf:bean:helloWorld?dataFormat=POJO")
于 2012-11-01T11:30:48.127 に答える