gpt4 book ai didi

java - CXF:将隐式 header 添加到 CXF SOAP/REST Web 服务的 WSDL 和 WADL 响应

转载 作者:搜寻专家 更新时间:2023-10-30 21:31:01 25 4
gpt4 key购买 nike

我正在尝试为 CXF SOAP/REST Web 服务(由 Camel 管理)的 WSDL 和 WADL 响应添加隐式 header 。

(这些不一定是安全 header ....)

我所说的“隐式 header ”是指点击服务的 WSDL/WADL URL 将表明客户端希望在请求中提供 header 。

但我不想在 Web 服务的签名中明确指定 header 。

我有一个 CXF 拦截器,它向每个 SOAP/REST 响应添加一个隐式 header 。

因此,由于 WSDL/WADL 文档是作为对某些 GET 请求的响应发送的,我正在考虑以某种方式使用类似的拦截器将 header 数据添加到 WSDL/WADL 响应中。我怎么能完成如此了不起的壮举?

这是向每个 SOAP/REST 响应添加隐式 header 的 CXF 拦截器:

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 2.7.4

在 CXF 中,WSDL 是通过链中的拦截器生成的,称为 WSDLGetInterceptor,它位于 READ 链中。

它的基本设计是

  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 文档(添加/创建 DOM 节点)或通过 XSLT,无论哪种方式最适合您,您都可以通过标准 API 返回处理标准 XML。

CXF 2.7.x(其中 x 大于 4 且小于 10)

原理是一样的,只是拦截器的作用不同。

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

所以它有点难/不太干净。但是使用抢占基本拦截器(之前注册自己)的相同原则,您可以覆盖 cleanUpOutInteceptors 来操作消息,就像在 2.7.4 中一样,通过访问 WSDL outMessage.get(DOCUMENT_HOLDER)

WADL

抱歉,我没有专业知识,但我猜 CXF 对两者都有相同的架构......

关于java - CXF:将隐式 header 添加到 CXF SOAP/REST Web 服务的 WSDL 和 WADL 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29610497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com