CXF:为CXF SOAP / REST Web服务的WSDL和WADL响应添加隐式标头

猛击

我正在尝试为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)
    {
    }
}
GPI:

CXF 2.7.4

在CXF中,WSDL是通过位于链中的in链中的Interceptor生成WSDLGetInterceptorREAD

它的基本设计是

  1. 检查呼叫是否为HTTP GET
  2. 准备输出消息以返回
  3. 访问wsdl(从Java或从静态资源)
  4. 将wsdl写入输出消息
  5. 中断拦截器链以提供输出消息

对这个过程采取行动的最简单方法是,通过预先注册自己的实现,抢占该拦截器的工作。

在默认的总线上,删除标准的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的方式。

CXF 2.7.x(其中x在> 4和<10的某处)

主体是相同的,但是拦截器的工作方式不同。

  1. 它(在私有方法中)将WSDL作为DOM文档放入out消息属性中。
  2. 它清除所有拦截器的输出拦截器链(绝对必要除外)
  3. WSDLGetOutInterceptor在输出链中注册一个
  4. 它停止IN链并前进到停止链
  5. WSDLGetOutInterceptor做它的序列化工作

因此,它有点难/不太干净。但是,使用抢占基本拦截器(在之前注册自己)的相同原理cleanUpOutInteceptors,可以像通过2.7.4一样通过访问WSDL来重写来操纵消息。outMessage.get(DOCUMENT_HOLDER)

瓦德

抱歉,我没有专门知识,但是我想CXF两者都具有相同的体系结构...

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章