2012-11-22 2 views
0

안녕하세요! SOAP 호출에 헤더를 추가하려고합니다. 저는 웹 서비스에 익숙합니다. 내가 CXF를 사용하고SOAP : 새로운 헤더 추가를 위해 AXIS 1.4에서 CXF로 메소드를 마이그레이션하십시오.

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

:

내가 다운로드 할 파일을 웹 서비스를 사용해야 할 때마다, 내가 좋아하는 헤더를 추가해야합니다. 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 요소를 만드는 경우 헤더 객체에 데이터 바인딩을 설정하지 않아야합니다. JAXB (또는 다른) 유형을 사용하는 경우에만 데이터 바인딩이 필요합니다. 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(); 
    } 
} 
관련 문제