在Eclipse中使用Java调用SOAP WebService时的SOAP Header绑定问题
如何在Eclipse中调用带SOAP Header的Axis WebService
从你的WSDL和问题描述来看,问题很明确——你在SOAP UI里已经配置了必需的LoginToken Header,但Eclipse自动生成的WebService客户端默认不会携带这个Header,导致服务端返回「无效/过期令牌」错误。下面给你两种在Eclipse中给Axis WebService请求绑定SOAP Header的可行方案:
方法一:基于Axis自动生成的客户端代码添加Header
假设你已经通过Eclipse的Web Service Client向导生成了客户端代码,按以下步骤操作:
- 找到WSDL对应的Java类:
HeaderInfo和HeaderInfoMsg(这些是工具自动生成的,对应WSDL里定义的Header类型) - 创建并配置Header实例:
// 实例化HeaderInfo并设置有效LoginToken HeaderInfo headerInfo = new HeaderInfo(); headerInfo.setLoginToken("你的有效令牌字符串"); // 将HeaderInfo包装成对应消息对象 HeaderInfoMsg headerMsg = new HeaderInfoMsg(); headerMsg.setHeaderInfoPart(headerInfo);
- 获取Axis的
Call对象并添加Header:
// 初始化服务客户端 TSProviderService serviceLocator = new TSProviderServiceLocator(); TSProvider servicePort = serviceLocator.getTSProvider(); // 转换为Stub对象,获取核心调用实例Call Call call = ((Stub) servicePort)._getCall(); // 创建SOAPHeaderElement,注意命名空间必须和WSDL里的一致 SOAPHeaderElement headerElement = new SOAPHeaderElement( "http://webservice.servicecomp.arun.com", // WSDL中header的namespace "HeaderInfoPart" // WSDL中header的part名称 ); // 将配置好的HeaderInfo对象绑定到Header元素 headerElement.setValue(headerInfo); // 添加到Call的Header集合中 call.addHeader(headerElement);
- 正常调用服务方法即可:
String response = servicePort.loadTimesheetData("你的psNo参数", "你的周起始日期参数");
方法二:手动构建SOAP请求(无需自动生成代码)
如果不想依赖自动生成的客户端代码,可以手动构造完整的SOAP消息,包含Header部分:
import javax.xml.soap.*; import java.net.URL; public class ManualSoapClient { public static void main(String[] args) throws Exception { // 创建SOAP消息工厂 SOAPMessageFactory factory = SOAPMessageFactory.newInstance(); SOAPMessage soapMsg = factory.createMessage(); // 获取SOAP Header和Body SOAPHeader soapHeader = soapMsg.getSOAPHeader(); SOAPBody soapBody = soapMsg.getSOAPBody(); // 构建LoginToken Header QName headerQName = new QName("http://webservice.servicecomp.arun.com", "HeaderInfoPart"); SOAPHeaderElement headerElement = soapHeader.addHeaderElement(headerQName); SOAPElement loginTokenNode = headerElement.addChildElement("LoginToken"); loginTokenNode.addTextNode("你的有效令牌字符串"); // 构建请求Body QName methodQName = new QName("http://webservice.servicecomp.arun.com", "loadTimesheetData"); SOAPBodyElement methodElement = soapBody.addBodyElement(methodQName); methodElement.addChildElement("a_psNo").addTextNode("你的psNo参数"); methodElement.addChildElement("a_weekStartDate").addTextNode("你的周起始日期参数"); // 保存消息变更 soapMsg.saveChanges(); // 发送请求到服务地址 URL endpoint = new URL("http://localhost:8080/axis/services/TSProvider"); SOAPConnection connection = SOAPConnectionFactory.newInstance().createConnection(); SOAPMessage responseMsg = connection.call(soapMsg, endpoint); // 处理响应(这里可以根据需要解析responseMsg) System.out.println("服务响应:" + responseMsg.getSOAPBody().getTextContent()); connection.close(); } }
关键注意事项
- 确保
LoginToken是有效且未过期的,和你在SOAP UI中使用的令牌完全一致 - 命名空间必须完全匹配WSDL中定义的值(
http://webservice.servicecomp.arun.com),否则服务端无法识别Header - 如果使用的是Axis2客户端,代码细节会略有不同,但核心思路都是构造对应SOAP Header元素并添加到请求中
内容的提问来源于stack exchange,提问作者Arun Kumar A
相关产品推荐
相关产品推荐

