我正在尝试为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是通过位于链中的in链中的Interceptor生成WSDLGetInterceptor
的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节点)或通过XSLT修改生成的DOM文档,无论哪种方式都最适合您,您将回到通过标准API处理标准XML的方式。
主体是相同的,但是拦截器的工作方式不同。
WSDLGetOutInterceptor
在输出链中注册一个WSDLGetOutInterceptor
做它的序列化工作因此,它有点难/不太干净。但是,使用抢占基本拦截器(在之前注册自己)的相同原理cleanUpOutInteceptors
,可以像通过2.7.4一样通过访问WSDL来重写来操纵消息。outMessage.get(DOCUMENT_HOLDER)
抱歉,我没有专门知识,但是我想CXF两者都具有相同的体系结构...
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句