当前位置: 首页 > 知识库问答 >
问题:

在Camel CXF中将自定义Soap标头设置为pojo消息

郑锋
2023-03-14

我对cxf soap头有问题。我使用Contract-firs开发方法建立了一个cxf项目。我想调用带有cxf组件的web服务,如下所示。

<cxf:cxfEndpoint id="ICCSCustomerService" 
                 address="http://localhost:8080/iccs-xsoap/CustomerService/updateCustomer"
                 serviceClass="de.iccs.xsoap.customer.v1.CustomerServiceImpl" >
</cxf:cxfEndpoint>

我想发送一个pojo消息,抛出一个直接组件作为对ws的请求。我的路线如下所示:

<route id="CustomerServiceUpdateCustomerTest">
        <camel:from uri="direct:iccsUpdateCustomerRequest"/>
        <camel:process ref="addCredentials"/>
        <to uri="cxf:bean:ICCSCustomerService"/>  
        <camel:to uri="stream:out"/>
</route>

我需要实现这样一个soap头:

<ns2:Header>
    <simpleAuth xmlns="http://xsoap.iccs.de/v1" password="abc" username="xxx"/>
</ns2:Header>

为了将其归档,我编写了一个这样的处理器(另请参见http://camel.apache.org/cxf.html):

@Override 
public void process(Exchange exchange) throws Exception { 
   List<SoapHeader> soapHeaders = CastUtils.cast((List<?)exchange.getOut().getHeader(Header.HEADER_LIST)); 
    // Insert a new header 
    String xml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><outofbandHeader " 
        + "xmlns=\"http://cxf.apache.org/outofband/Header\" hdrAttribute=\"testHdrAttribute\" " 
        + "xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" soap:mustUnderstand=\"1\">" 
        + "<name>simpleAuth username=\"xxx\" password=\"abc\" xmlns=\"http://xsoap.iccs.de/v1\"</name></outofbandHeader>"; 

    SoapHeader newHeader = new SoapHeader(new QName("http://xsoap.iccs.de/v1", "simpleAuth"), 
                   DOMUtils.readXml(new StringReader(xml)).getDocumentElement()); 
    // make sure direction is OUT since it is a response message. 
    newHeader.setDirection(Direction.DIRECTION_OUT); 
    //newHeader.setMustUnderstand(false); 
    soapHeaders.add(newHeader); 
}

不幸的是,我在这条语句中得到了一个空指针异常:List soapHeaders=CastUtils。铸件((列表

显然,此消息中没有肥皂剧标题。而且它似乎根本不是肥皂剧消息。像这样Marsching

       <camel:marshal>
            <soapjaxb contextPath="de.iccs.xsoap.customer.v1" />
        </camel:marshal>
        <camel:process ref="addCredentials"/>

不起作用,因为它只生成一个没有soap头的soap信封。(当然,由于cxfendpoint在pogo模式下工作,所以这不起作用)您可以给我一个示例,说明如何从pojo消息设置soap消息(带有soap头)。

谢谢你,加布里埃尔

共有1个答案

邓元白
2023-03-14

不知道你是否已经解决了你的问题,但我也经历了类似的事情,所以也许有人会受益。

如果您的NPE是因为没有现有的标题,那么如果需要,创建一个新的列表是完全可以接受的。

if (message.getHeader(Header.HEADER_LIST) == null) {
    message.setHeader(Header.HEADER_LIST, new ArrayList<SoapHeader>());
}

如果已经为simpleAuth元素使用@XMLRootElement对类进行了注释(生成或创建),那么可以使用接受JAXBDataBinding的SoapHeader构造函数。CXF将为您封送标头。

@Override 
public void process(Exchange exchange) throws Exception {

    Message in = exchange.getIn();
    if (in.getHeader(Header.HEADER_LIST) == null) {
        in.setHeader(Header.HEADER_LIST, new ArrayList<SoapHeader>());
    }
    List<SoapHeader> headers = CastUtils.cast((List<?>)in.getHeader(Header.HEADER_LIST));

    SimpleAuth auth = new SimpleAuth();
    auth.setUsername("xxx");
    auth.setPassword("abc");

    try {
        SoapHeader header = new SoapHeader(new QName("http://xsoap.iccs.de/v1", "simpleAuth"),
                auth, new JAXBDataBinding(SimpleAuth.class));
        header.setDirection(Direction.DIRECTION_OUT);
        header.setMustUnderstand(true);
        soapHeaders.add(header);            
    } catch (JAXBException e) {
    e.printStackTrace();
    }
}
 类似资料:
  • 问题内容: 我正在尝试使用Axis使用.NET 2.0 Web服务。我使用Eclipse WST插件生成了Web服务客户端,到目前为止看来还可以。 这里是预期的SOAP标头: 我没有找到有关如何从Axis客户端配置此标头的任何文档。当我使用Visual Studio C#Express 2008生成客户端时,它会生成一个具有两个String属性(和)的类,并且所有客户端方法都将此类的对象作为第一个

  • 如何为截击请求设置自定义标题?目前,有一种方法可以为POST请求设置正文内容。我有一个简单的GET请求,但我需要同时传递自定义头。我不知道JsonRequest类如何支持它。有可能吗?

  • 我正在尝试设置如下自定义标题 我尝试了两种方法,使用标题字典 #1 #2 我在这两种方法中得到的错误是: 标题名称使用不当。确保请求标头与HttpRequestMessage一起使用,响应标头与HttpResponseMessage一起使用,内容标头与HttpContent对象一起使用。 如何在C#net core 3.1的HttpClient中设置帖子的标题?不能设置自定义标题吗?

  • 问题内容: 我有一个运行在端口9091上的browsermob代理。我试图使用browsermob-proxy REST API设置自定义标头。当我通过代理使用Selenium向我的应用程序发出请求时,我的应用程序控制台中没有显示标题。下面是我的代码。请求主体基于此处的文档。我的要求是针对此特定用例使用BrowserMob代理API而不是其Java库。我在下面的代码中做错了什么? 编辑1 我尝试了

  • 我试图在我的邮件中添加自定义标题,所以每当异常发生并最终出现在死信队列中时,我都可以看到异常是什么。然而,我所有的尝试都失败了。 使用。setHeader() 在outMessage上设置标题 正在设置exchange的属性 不允许将异常设置为有效负载中的属性。 RABBITMQ字符串:

  • 问题内容: 我最近开始在Node.js中工作,在app.js文件中有以下一行: 现在,如何设置自己的自定义favicon.ico? 问题答案: 在Express 4中 安装收藏夹中间件,然后执行以下操作: 或者更好,使用模块: (请注意,此解决方案也可以在Express 3应用中使用) 在Express 3中 根据API,接受一个location参数: 大多数时候,您可能希望这样做(如vsync建