4

我对 cxf 肥皂标题有疑问。我使用 Contract-firs-development 方法建立了一个 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>

我需要实现一个像这样的肥皂头:

<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.cast((List

显然,此消息中没有肥皂标题。它似乎根本不是肥皂信息。像这样编组

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

不起作用,因为它只产生一个没有肥皂头的肥皂信封。(当然,这在 cxf-endpoint 在 pogo 模式下工作时不起作用)您能否提供一个示例,如何从 pojo 消息中设置一个肥皂消息(带有肥皂头)。

谢谢加布里埃尔

4

1 回答 1

4

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

如果您的 NPE 是由于没有现有的标头,那么在需要时创建一个新列表是完全可以接受的。

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

但是您可能对用于填充 SoapHeader 的手工制作的 XML 有另一个问题。您仍在使用原始 CXF 示例中的 outofbandHeader 元素;这是示例中的特定标头,而不是带外标头的通用包装器。此外,您的 simpleAuth 未标记为元素(尽管很难阅读......)。

如果您为 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();
    }
}
于 2013-03-07T19:37:25.697 回答