You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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向导生成了客户端代码,按以下步骤操作:

  1. 找到WSDL对应的Java类:HeaderInfo和HeaderInfoMsg(这些是工具自动生成的,对应WSDL里定义的Header类型)
  2. 创建并配置Header实例:
// 实例化HeaderInfo并设置有效LoginToken
HeaderInfo headerInfo = new HeaderInfo();
headerInfo.setLoginToken("你的有效令牌字符串");

// 将HeaderInfo包装成对应消息对象
HeaderInfoMsg headerMsg = new HeaderInfoMsg();
headerMsg.setHeaderInfoPart(headerInfo);
  1. 获取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);
  1. 正常调用服务方法即可:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:43:10