2012-11-22 26 views
0

嗨!我試圖給SOAP調用添加一個頭文件。 我是使用網絡服務的新手。SOAP:將方法從AXIS 1.4遷移到CXF以添加新標頭

每次我需要使用Web服務下載的文件時,我需要添加一個頭,如:

<UserIdHeader xmlns="http://www.stats.com/"> 
    <TicketId>defe3a08-4c8a-47c4-9303-98e09c475532</TicketId> 
</UserIdHeader> 

我使用CXF。我有一個使用Axis 1.4創建的例子。 剩下的唯一東西(我希望)是添加這個頭。

這是我必須更新:

private static void addHeader(String ticketId) { 
    SOAPHeaderElement header = new SOAPHeaderElement("http://www.stats.com/", "UserIdHeader"); 
    SOAPElement node; 

    org.apache.axis.client.Stub s = (Stub) service; 
    s.clearHeaders(); 

    try { 
     node = header.addChildElement("TicketId"); 
     node.addTextNode(ticketId); 
     s.setHeader((org.apache.axis.message.SOAPHeaderElement) header); 
    } catch (SOAPException e) { 
     e.printStackTrace(); 
    } 
} 

這就是我如何試圖更新:

private static void addHeader(String ticketId) throws JAXBException, ParserConfigurationException { 
    Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); 

    Element eTicketId = doc.createElement("TicketId"); 
    eTicketId.setTextContent(ticketId); 

    List<Header> headers = new ArrayList<Header>(); 
    Header header = new Header(new QName("http://www.stats.com/", "UserIdHeader"), eTicketId, 
      new JAXBDataBinding(String.class)); 
    headers.add(header); 

    BindingProvider.class.cast(service).getRequestContext().put(Header.HEADER_LIST, headers); 
} 

但我發現了以下異常:

[PhaseInterceptorChain] Interceptor for {http://www.stats.com/}Service#{http://www.stats.com/}GetFileList has thrown exception, unwinding now 
org.apache.cxf.interceptor.Fault: Marshalling Error: org.apache.xerces.dom.ElementImpl is not known to this context 
    at org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:261) 
    at org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:168) 
    at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.writeSoapEnvelopeStart(SoapOutInterceptor.java:156) 
    at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleMessage(SoapOutInterceptor.java:81) 
    at org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleMessage(SoapOutInterceptor.java:61) 
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262) 
    at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:531) 
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:464) 
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:367) 
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:320) 
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:89) 
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:134) 

我試過甚至添加了攔截器,但我不知道如何傳遞ticketId。

有什麼想法?

回答

1

如果您正在創建DOM元素,則不應將數據綁定設置爲Header對象。如果您使用的是JAXB(或其他)類型,則只需要Databinding。 CXF直接處理DOM元素。

+0

感謝丹尼爾!我不得不改變方法,但你的答案是這樣。我將把下面的工作方法。 – Agorreca

0

這是我有方法的工作(由於某種原因,與以前的做法頭未寫入):

private static void addHeader(String ticketId) { 
    try { 
     SOAPFactory sf = SOAPFactory.newInstance(); 
     SOAPElement userIdHeaderElement = sf.createElement(new QName("http://www.stats.com/", "UserIdHeader")); 
     SOAPElement ticketIdElement = sf.createElement(new QName(null, "TicketId")); 
     ticketIdElement.addTextNode(ticketId); 
     userIdHeaderElement.addChildElement(ticketIdElement); 
     List<Header> headers = new ArrayList<Header>(); 
     Header dummyHeader = new Header(new QName("http://www.stats.com/"), userIdHeaderElement); 
     headers.add(dummyHeader); 
     BindingProvider.class.cast(service).getRequestContext().put(Header.HEADER_LIST, headers); 
    } catch (SOAPException e) { 
     e.printStackTrace(); 
    } 
}