4

cxf soap-headers に問題があります。Contract-firs-development メソッドを使用して cxf-project をセットアップしました。このような cxf コンポーネントを使用して Web サービスを呼び出したいと考えています。

<cxf:cxfEndpoint id="ICCSCustomerService" 
                 address="http://localhost:8080/iccs-xsoap/CustomerService/updateCustomer"
                 serviceClass="de.iccs.xsoap.customer.v1.CustomerServiceImpl" >
</cxf:cxfEndpoint>

ws のリクエストとして pojo-message throw ダイレクト コンポーネントを送信したい 私のルートは次のようになります。

<route id="CustomerServiceUpdateCustomerTest">
        <camel:from uri="direct:iccsUpdateCustomerRequest"/>
        <camel:process ref="addCredentials"/>
        <to uri="cxf:bean:ICCSCustomerService"/>  
        <camel:to uri="stream:out"/>
</route>

次のような SOAP ヘッダーを実装する必要があります。

<ns2:Header>
    <simpleAuth xmlns="http://xsoap.iccs.de/v1" password="abc" username="xxx"/>
</ns2:Header>

これをアーカイブするために、次のようなプロセッサを作成しました ( http://camel.apache.org/cxf.htmlの例も参照してください)。

@Override 
public void process(Exchange exchange) throws Exception { 
   List<SoapHeader> soapHeaders = CastUtils.cast((List<?)exchange.getOut().getHeader(Header.HEADER_LIST)); 
    // Insert a new header 
    String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><outofbandHeader " 
        + "xmlns=\"http://cxf.apache.org/outofband/Header\" hdrAttribute=\"testHdrAttribute\" " 
        + "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" soap:mustUnderstand=\"1\">" 
        + "<name>simpleAuth username=\"xxx\" password=\"abc\" xmlns=\"http://xsoap.iccs.de/v1\"</name></outofbandHeader>"; 

    SoapHeader newHeader = new SoapHeader(new QName("http://xsoap.iccs.de/v1", "simpleAuth"), 
                   DOMUtils.readXml(new StringReader(xml)).getDocumentElement()); 
    // make sure direction is OUT since it is a response message. 
    newHeader.setDirection(Direction.DIRECTION_OUT); 
    //newHeader.setMustUnderstand(false); 
    soapHeaders.add(newHeader); 
}

残念ながら、次のステートメントで null-pointer Exception が発生します: List soapHeaders = CastUtils.cast((List

明らかに、このメッセージには SOAP ヘッダーはありません。そして、それは石鹸のメッセージではないようです。このようなマーシャリング

       <camel:marshal>
            <soapjaxb contextPath="de.iccs.xsoap.customer.v1" />
        </camel:marshal>
        <camel:process ref="addCredentials"/>

これは、soap-header なしで soap-envelope のみを生成するため、機能しません。(もちろん、これは cxf-endpoint が pogo-mode で機能するため機能しません) pojo-message から SOAP メッセージ(soap-header 付き)を設定する方法の例を教えてください。

ありがとうガブリエル

4

1 に答える 1

4

すでに問題を解決したかどうかはわかりませんが、私も同様のことを経験したので、誰かが恩恵を受けるかもしれません.

既存のヘッダーがないために NPE が発生する場合は、必要に応じて新しいリストを作成しても問題ありません。

if (message.getHeader(Header.HEADER_LIST) == null) {
    message.setHeader(Header.HEADER_LIST, new ArrayList<SoapHeader>());
}

しかし、手作りの XML を使用して SoapHeader にデータを入力すると、別の問題が発生する可能性があります。元の CXF の例の outofbandHeader 要素をまだ使用しています。これは例の特定のヘッダーであり、帯域外ヘッダーの一般的なラッパーではありません。また、あなたの simpleAuth は要素としてマークアップされていません (読みにくいですが...)。

simpleAuth 要素の @XMLRootElement を使用して (生成または作成された) クラスにアノテーションを付けた場合、JAXBDataBinding を受け取る SoapHeader コンストラクターを使用できます。CXF がヘッダーをマーシャリングします。

@Override 
public void process(Exchange exchange) throws Exception {

    Message in = exchange.getIn();
    if (in.getHeader(Header.HEADER_LIST) == null) {
        in.setHeader(Header.HEADER_LIST, new ArrayList<SoapHeader>());
    }
    List<SoapHeader> headers = CastUtils.cast((List<?>)in.getHeader(Header.HEADER_LIST));

    SimpleAuth auth = new SimpleAuth();
    auth.setUsername("xxx");
    auth.setPassword("abc");

    try {
        SoapHeader header = new SoapHeader(new QName("http://xsoap.iccs.de/v1", "simpleAuth"),
                auth, new JAXBDataBinding(SimpleAuth.class));
        header.setDirection(Direction.DIRECTION_OUT);
        header.setMustUnderstand(true);
        soapHeaders.add(header);            
    } catch (JAXBException e) {
    e.printStackTrace();
    }
}
于 2013-03-07T19:37:25.697 に答える