0

やあ!SOAP呼び出しにヘッダーを追加しようとしています。私はWebサービスを扱うのが初めてです。

ファイルをダウンロードするためにWebサービスを使用する必要があるたびに、次のようなヘッダーを追加する必要があります。

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

私はCXFを使用しています。Axis1.4で作成した1つの例があります。残っているのは(私が望む)唯一のことは、このヘッダーを追加することです。

これは私が更新しなければならないものです:

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を渡す方法がわかりませんでした。

何か案が?

4

2 に答える 2

1

DOM要素を作成する場合は、Headerオブジェクトにデータバインディングを設定しないでください。JAXB(または他の)タイプを使用している場合にのみ、データバインディングが必要です。CXFはDOM要素を直接処理します。

于 2012-11-22T02:25:40.960 に答える
1

これが私がメソッドを機能させる方法です(何らかの理由で、以前のアプローチではヘッダーが書き込まれませんでした):

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();
    }
}
于 2012-11-22T17:56:26.003 に答える