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

Apache Axis1.4 WSDL生成SOAP响应及Spring Boot实现问题咨询

我太懂这种卡在半中间的感觉了——用Axis 1.4的WSDL生成了几个服务类,结果关键的请求、响应对象没出来,Spring Boot里只能拿到光秃秃的字符串响应,完全没法封装成带Header和Body的标准SOAP格式。别着急,咱们一步步来解决:

第一步:用Axis官方工具补全请求/响应对象

SoapUI生成Axis代码有时候会漏生成请求响应类,不如直接用Axis 1.4自带的wsdl2java工具靠谱。你可以这么做:

  • 找到Axis的axis.jar(一般在Axis安装目录的lib文件夹里)
  • 打开终端,执行以下命令重新生成完整代码:
java -jar axis.jar org.apache.axis.wsdl.WSDL2Java -p com.your.project.soap -o ./soap-generated your-service.wsdl

这里的参数简单解释下:

  • -p:给生成的代码指定一个专属包名,避免和项目里其他代码冲突
  • -o:指定生成文件的输出目录,方便你把这些类导入到Spring Boot项目里
    生成完成后,你应该能看到XXXRequest、XXXResponse这类对应WSDL操作的实体类了。
第二步:在Spring Boot里封装完整SOAP响应

有了请求响应对象后,咱们可以借助Axis的Stub API来构建带Header和Body的SOAP响应。这里给你一段可复用的代码示例:

import org.apache.axis.client.Stub;
import org.apache.axis.message.SOAPHeaderElement;
import org.springframework.http.ResponseEntity;
import org.springframework.http.MediaType;
import javax.xml.namespace.QName;

// 假设你的服务方法是getUserInfo,参数是GetUserInfoRequest,返回GetUserInfoResponse
try {
    SrvServiceLocator locator = new SrvServiceLocator();
    Srv_PortType servicePort = locator.getSrvPort();
    
    // 把Port强制转成Stub,这样才能操作SOAP消息的Header和Envelope
    Stub soapStub = (Stub) servicePort;
    
    // 1. 给SOAP Header添加内容(如果你的服务需要Header的话)
    QName headerName = new QName("http://your-service-namespace.com", "ServiceAuthHeader");
    SOAPHeaderElement authHeader = new SOAPHeaderElement(headerName);
    authHeader.addChildElement("Token").setValue("your-auth-token");
    soapStub.setHeader(authHeader);
    
    // 2. 构造请求对象并调用服务
    GetUserInfoRequest request = new GetUserInfoRequest();
    request.setUserId("12345");
    GetUserInfoResponse rawResponse = servicePort.getUserInfo(request);
    
    // 3. 获取完整的SOAP Envelope(包含Header和Body)
    String fullSoapResponse = soapStub._getCall().getMessageContext().getResponseMessage().getSOAPEnvelope().toString();
    
    // 4. 在Spring Boot接口里返回标准SOAP响应
    return ResponseEntity.ok()
            .contentType(MediaType.TEXT_XML)
            .body(fullSoapResponse);
} catch (Exception e) {
    // 这里记得处理异常,比如返回SOAP格式的错误响应
    e.printStackTrace();
    return ResponseEntity.internalServerError().build();
}

注意:你之前写的srvSopaBindingStub应该是拼写错误,正确的类名应该是SrvSoapBindingStub,别写错了哦。

第三步:如果还是没生成请求响应对象?

如果用wsdl2java还是没拿到请求响应类,那大概率是你的WSDL本身有问题:

  • 检查WSDL里的每个operation是否明确关联了input和output消息,并且这些消息对应的complexType定义完整
  • 用WSDL验证工具(比如本地的XML编辑器或者在线校验工具)检查WSDL的语法和命名空间是否正确,有没有遗漏的定义

另外,如果你不想继续依赖Axis 1.4这种老框架,也可以试试Spring Boot自带的Spring Web Services组件,它能更优雅地处理SOAP服务,但需要重新基于WSDL生成Spring WS的代码,适配成本会高一点,不过长期来看更易维护。

内容的提问来源于stack exchange,提问作者tyro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:07:41