何らかの形で関連する 2 つの質問を 1 つにまとめて質問しても問題ないことを願っています。Reliable Messaging を使用して Web サービスに SOAP メッセージを送信するためにキャメル ルートを使用しています。今、私が遭遇した 2 つの問題があります。まず、使用されている WS-Addressing のバージョンが間違っています。2005/08 が必要ですが、代わりに 2004/08 を使用しています。
私が使用しているエンドポイントを設定するため(少し短縮)
CxfEndpoint cxfEndpoint = new CxfEndpoint();
cxfEndpoint.setWsdlURL(getWsdlURL());
cxfEndpoint.setDataFormat(DataFormat.CXF_MESSAGE);
cxfEndpoint.setCamelContext(camelContext);
camelContext.addEndpoint(outEndpoint.getId(), cxfEndpoint);
また、camel-context.xml ファイルと別の http-conduit.xml ファイルに cxfbus を設定しました。
WS-Addressing に関する私の質問は、WS-Addressing 2005/08 を使用するように変更するにはどうすればよいですか? エンドポイントが呼び出される前に、ルートに以下を追加しようとしましたが、アドレス指定名前空間は変更されませんでした。
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
AddressingPropertiesImpl addrProps =
new AddressingPropertiesImpl("http://www.w3.org/2005/08/addressing");
Map<String, Object> requestContext = new HashMap<String, Object>();
requestContext.put("javax.xml.ws.addressing.context", addrProps);
exchange.getIn().setHeader(Client.REQUEST_CONTEXT, requestContext);
}
})
CreateSequence のオファーに関して、エンドポイントが CamelContext に追加される前に以下が追加されました。
RMManager rmManager = cxfEndpoint.getBus().getExtension(RMManager.class);
rmManager.getSourcePolicy().setIncludeOffer(false);
これは問題なく機能しましたが、http コンジットが使用されなくなったという厄介な副作用がありました。私はこれを次のように修正しました:
cxfEndpoint.setBus(bus);
バスが@Autowiredされている場所
しかし、私の意見では、これにより、同様の方法で作成された着信 CXF エンドポイントの WS-Reliable Messaging が壊れました。正しいメッセージは引き続き送信されますが、CreateSequenceResponse が送信される前に空の SOAP メッセージが送信され、クライアントがシーケンスの作成から脱落します。
私の質問は、CreateSequence からオファーを削除するより良い方法はありますか?