[英]CXF: Add implicit headers to WSDL and WADL responses for a CXF SOAP/REST web service
我正在嘗試為CXF SOAP / REST Web服務(由Camel管理)的WSDL和WADL響應添加隱式標頭。
(這些不一定是安全標題....)
通過“隱式標頭”,我的意思是,點擊服務的WSDL / WADL URL將顯示客戶端期望在請求中提供標頭。
但我不想在Web服務的簽名中明確指定標頭。
我有一個CXF攔截器,它為每個SOAP / REST響應添加一個隱式頭。
因此,由於WSDL / WADL文檔是作為對某些GET請求的響應而發送的,所以我想以某種方式使用類似的攔截器將頭數據添加到WSDL / WADL響應中。 我怎么能進行這樣一個奇妙的壯舉?
這是CXF攔截器,它為每個SOAP / REST響應添加一個隱式頭:
public class MyInterceptor extends AbstractPhaseInterceptor<Message> {
public MyInterceptor()
{
super(Phase.RECEIVE);
}
@Override
public void handleMessage(Message message)
{
try
{
//soap
if (message instanceof SoapMessage)
{
List<Header> headers = ((SoapMessage)message).getHeaders();
Header dummyHeader = new Header(new QName("uri:org.apache.cxf", "dummy"), "decapitated", new JAXBDataBinding(String.class));
headers.add(dummyHeader);
}
//rest
else
{
Map<String, List> headers = (Map<String, List>) message.get(Message.PROTOCOL_HEADERS);
String dummyHeader = "decapitated";
headers.put("dummy", Collections.singletonList(dummyHeader));
}
}
catch (JAXBException e)
{
throw new Fault(e);
}
}
@Override
public void handleFault(Message messageParam)
{
}
}
在CXF中,WSDL是通過一個名為WSDLGetInterceptor
鏈中的Interceptor生成的,它位於READ
鏈中。
它的基本設計是
采取行動的最簡單方法是搶占這個攔截器,使其無法通過之前注冊您自己的實現來完成其工作。
刪除標准的CXF攔截器在默認的總線上是一件“難事”(最簡單的方法是注冊你自己的攔截器,把它放在鏈中,然后讓它刪除其他攔截器,如message.getInterceptorChain().remove(removeInterceptor);
但是在標准WSDL攔截器之前添加自己的東西很簡單:
public MyWSDLGetInterceptor() {
super(Phase.READ);
addBefore(WSDLGetInterceptor.class.getName());
}
MyWSDLGetInterceptor
將擴展標准的WSDLGetInterceptor
,您只需覆蓋:
public Document getDocument(Message message,
String base,
Map<String, String> params,
String ctxUri,
EndpointInfo endpointInfo) {
Document domDocument = super.getDocument(message, base, params, ctxUri, endpointInfo);
domDocument.getChildNodes(); // Whatever you need to add remove
return domDocument; // Once modified
}
您可以動態修改生成的DOM Document(添加/創建DOM節點)或通過XSLT,無論您最喜歡什么,您都可以通過標准API處理標准XML。
校長是相同的,但攔截器的工作方式不同。
WSDLGetOutInterceptor
WSDLGetOutInterceptor
執行其序列化作業 所以它有點難/干凈。 但是使用相同的預占基礎攔截器的原則(之前注冊自己),你可以通過outMessage.get(DOCUMENT_HOLDER)
訪問WSDL來覆蓋cleanUpOutInteceptors
來操縱消息,就像在2.7.4情況下一樣。
對不起,我沒有專業知識,但我猜CXF對兩者都有相同的架構......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.