2011-08-02 68 views
9

我在创建输出拦截器的阶段,并从SOAP消息中获取OuputStream。但是,我怎么才能在发送到端点之前修改SOAP信封?我想删除一些xml元素。如何修改生成的SOAP请求?

回答

3

一种方式可能是获取文档并通过XSLT转换运行它。

你可以通过调用

@Override 
public void handleMessage(SoapMessage message) throws Fault{ 
    SOAPMessage saaj = message.getContent(SOAPMessage.class); 
    Document doc = saaj.getSOAPPart(); // This actually returns a SOAPPart instance but it does implement the w3c Document interface 

    //play around with the document, doc is a reference so any changes made to that instance 
    //will be forwarded to the rest of the chain 
} 

小心在你的拦截器的的handleMessage文件得到的是,如果你有安全功能,如XML签名必须在皂含量进行,你必须确保你的拦截器发生在应用签名之前,否则您将使其无效。

要使用拦截器的时机,您可以指定它将运行的阶段。 CXF还应该遵守您将在相同阶段执行的配置顺序。

,但不要把我的话...检查这些更多信息

调试通过CXF的源代码也帮了我很大的了解它是如何工作的

----编辑----

(谢谢丹尼尔:-)

为了这个工作,你需要在你的堆栈中配置SAAJOutInterceptor。你可以手动添加它,或者简单地将它作为拦截器的一部分。 Here is一个拦截器的例子,几乎不需要你想要的。

+0

非常感谢您的回答Newtopian。 message.getContent(SOAPMessage.class)总是返回Null,但是:-(我应该在哪个阶段让这个代码访问SOAP Envelope? – kiwifrog

+2

您还需要在SAAJOutInterceptor中进行配置,以及进行转换的拦截器 –

+1

事实上,Daniel是对的,你需要确保SAAJOutInterceptor被配置为将数据序列化为SOAPMessage对象。默认情况下,它与我的设置一样,所以我不必担心太多。该对象将不再为空,您将可以随意使用DOM树。 – Newtopian