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
相关产品推荐
相关产品推荐

