gpt4 book ai didi

java - SOAP:将方法从 AXIS 1.4 迁移到 CXF 以添加新 header

转载 作者:行者123 更新时间:2023-12-01 15:02:03 38 4
gpt4 key购买 nike

嗨!我正在尝试向 SOAP 调用添加 header 。我是网络服务方面的新手。

每次我需要使用网络服务下载文件时,我都需要添加一个 header ,例如:

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

我正在使用 CXF。我有一个使用 Axis 1.4 制作的示例。唯一剩下的事情(我希望)是添加此 header 。

这是我必须更新的内容:

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。

有什么想法吗?

最佳答案

如果您正在创建 DOM 元素,则不应将数据绑定(bind)设置到 Header 对象中。仅当您使用 JAXB(或其他)类型时才需要数据绑定(bind)。 CXF 直接处理 DOM 元素。

关于java - SOAP:将方法从 AXIS 1.4 迁移到 CXF 以添加新 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13504467/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com