Spring Boot 3.x 构建 SOAP WebService:5步实现国家查询服务(附完整代码)
Spring Boot 3.x 构建 SOAP WebService5步实现国家查询服务附完整代码在当今企业级应用开发中SOAP协议仍然是金融、电信等关键领域的主流选择。Spring Boot 3.x与Spring Web Services的深度整合让开发者能够快速构建符合WS-I标准的Web服务。本文将手把手带你实现一个完整的国家信息查询服务涵盖从XSD定义到端点测试的全流程。1. 环境准备与项目初始化首先创建一个基础的Spring Boot 3.x项目添加以下关键依赖到pom.xmldependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web-services/artifactId /dependency dependency groupIdwsdl4j/groupId artifactIdwsdl4j/artifactId /dependency /dependencies build plugins plugin groupIdorg.codehaus.mojo/groupId artifactIdjaxb2-maven-plugin/artifactId version3.1.0/version executions execution idxjc/id goals goalxjc/goal /goals /execution /executions /plugin /plugins /build关键配置说明spring-boot-starter-web-services提供SOAP支持wsdl4j用于WSDL处理jaxb2-maven-plugin实现XSD到Java类的自动转换2. 定义XSD架构与WSDL在src/main/resources/schemas目录下创建countries.xsdxs:schema xmlns:xshttp://www.w3.org/2001/XMLSchema targetNamespacehttp://example.com/countries xmlns:tnshttp://example.com/countries elementFormDefaultqualified xs:element namegetCountryRequest xs:complexType xs:sequence xs:element namename typexs:string/ /xs:sequence /xs:complexType /xs:element xs:element namegetCountryResponse xs:complexType xs:sequence xs:element namecountry typetns:country/ /xs:sequence /xs:complexType /xs:element xs:complexType namecountry xs:sequence xs:element namename typexs:string/ xs:element namecapital typexs:string/ xs:element namepopulation typexs:int/ xs:element namecurrency typetns:currency/ /xs:sequence /xs:complexType xs:simpleType namecurrency xs:restriction basexs:string xs:enumeration valueUSD/ xs:enumeration valueEUR/ xs:enumeration valueCNY/ /xs:restriction /xs:simpleType /xs:schema执行mvn compile命令后JAXB会在target/generated-sources目录生成对应的Java类包括GetCountryRequestGetCountryResponseCountry等3. 实现数据仓库与端点创建内存型国家数据仓库Component public class CountryRepository { private static final MapString, Country countries new HashMap(); PostConstruct public void initData() { Country china new Country(); china.setName(China); china.setCapital(Beijing); china.setPopulation(1412000000); china.setCurrency(Currency.CNY); countries.put(china.getName(), china); Country usa new Country(); usa.setName(USA); usa.setCapital(Washington); usa.setPopulation(331000000); usa.setCurrency(Currency.USD); countries.put(usa.getName(), usa); } public Country findCountry(String name) { return countries.get(name); } }实现服务端点Endpoint public class CountryEndpoint { private static final String NAMESPACE_URI http://example.com/countries; private final CountryRepository countryRepository; Autowired public CountryEndpoint(CountryRepository countryRepository) { this.countryRepository countryRepository; } PayloadRoot(namespace NAMESPACE_URI, localPart getCountryRequest) ResponsePayload public GetCountryResponse getCountry(RequestPayload GetCountryRequest request) { GetCountryResponse response new GetCountryResponse(); response.setCountry(countryRepository.findCountry(request.getName())); return response; } }关键注解解析Endpoint标记为SOAP端点PayloadRoot定义处理的消息类型ResponsePayload声明返回值为响应体4. 服务配置与WSDL暴露配置WebService基础设置EnableWs Configuration public class WebServiceConfig extends WsConfigurerAdapter { Bean public ServletRegistrationBeanMessageDispatcherServlet messageDispatcherServlet(ApplicationContext context) { MessageDispatcherServlet servlet new MessageDispatcherServlet(); servlet.setApplicationContext(context); servlet.setTransformWsdlLocations(true); return new ServletRegistrationBean(servlet, /ws/*); } Bean(name countries) public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema countriesSchema) { DefaultWsdl11Definition wsdl new DefaultWsDL11Definition(); wsdl.setPortTypeName(CountriesPort); wsdl.setLocationUri(/ws); wsdl.setTargetNamespace(http://example.com/countries); wsdl.setSchema(countriesSchema); return wsdl; } Bean public XsdSchema countriesSchema() { return new SimpleXsdSchema(new ClassPathResource(schemas/countries.xsd)); } }启动应用后可通过以下URL访问WSDLhttp://localhost:8080/ws/countries.wsdl5. 服务测试与验证使用cURL测试服务curl --header content-type: text/xml \ --data request.xml \ http://localhost:8080/ws其中request.xml内容为soapenv:Envelope xmlns:soapenvhttp://schemas.xmlsoap.org/soap/envelope/ xmlns:gshttp://example.com/countries soapenv:Header/ soapenv:Body gs:getCountryRequest gs:nameChina/gs:name /gs:getCountryRequest /soapenv:Body /soapenv:Envelope预期响应示例SOAP-ENV:Envelope xmlns:SOAP-ENVhttp://schemas.xmlsoap.org/soap/envelope/ SOAP-ENV:Header/ SOAP-ENV:Body ns2:getCountryResponse xmlns:ns2http://example.com/countries ns2:country ns2:nameChina/ns2:name ns2:capitalBeijing/ns2:capital ns2:population1412000000/ns2:population ns2:currencyCNY/ns2:currency /ns2:country /ns2:getCountryResponse /SOAP-ENV:Body /SOAP-ENV:Envelope对于更复杂的场景可以添加SOAP头处理PayloadRoot(namespace NAMESPACE_URI, localPart getCountryRequest) ResponsePayload public GetCountryResponse getCountry( RequestPayload GetCountryRequest request, SoapHeader({ SECURITY_NS }authentication) SoapHeaderElement auth) { // 验证头信息 if (!validateHeader(auth)) { throw new AuthenticationException(Invalid credentials); } // ...原有处理逻辑 }6. 高级配置与优化对于生产环境建议添加以下增强配置WS-Security配置Bean public Wss4jSecurityInterceptor securityInterceptor() { Wss4jSecurityInterceptor interceptor new Wss4jSecurityInterceptor(); interceptor.setSecurementActions(UsernameToken); interceptor.setSecurementUsername(admin); interceptor.setSecurementPassword(secret); return interceptor; } Override public void addInterceptors(ListEndpointInterceptor interceptors) { interceptors.add(securityInterceptor()); }性能优化建议启用JAXB编译缓存plugin groupIdorg.codehaus.mojo/groupId artifactIdjaxb2-maven-plugin/artifactId configuration clearOutputDirfalse/clearOutputDir /configuration /plugin配置HTTP压缩server.compression.enabledtrue server.compression.mime-typestext/xml,application/soapxml7. 异常处理与调试实现自定义SOAP错误处理Endpoint public class CountryEndpoint { // ...其他方法 ExceptionHandler public void handleException(Exception ex, SoapMessage response) { TransformerFactory.newInstance().newTransformer() .transform(new DOMSource(createFault(ex)), new StreamResult(response.getSoapBody().getResult())); } private org.w3c.dom.Document createFault(Exception ex) { // 构建详细的SOAP Fault XML } }调试技巧启用SOAP消息日志logging.level.org.springframework.ws.client.MessageTracing.sentTRACE logging.level.org.springframework.ws.client.MessageTracing.receivedTRACE使用SoapUI工具进行可视化测试通过WireShark抓包分析原始SOAP报文

相关新闻

Unity随机地图生成实战:从算法原理到2D地牢实现

Unity随机地图生成实战:从算法原理到2D地牢实现

1. 项目概述:为什么我们需要随机地图生成?在游戏开发中,尤其是Roguelike、沙盒建造、策略探索等类型的项目中,一张固定不变的地图很快就会让玩家感到厌倦。重复的关卡意味着重复的策略和体验,游戏的寿命和可玩性会大打…

2026/7/9 22:19:43阅读更多 →
Unity WebGL实现GLB模型本地下载:jslib插件实战指南

Unity WebGL实现GLB模型本地下载:jslib插件实战指南

1. 项目概述与核心挑战 最近在做一个基于Unity WebGL的3D产品展示项目,客户提了个很实际的需求:用户在网页上浏览完一个复杂的设备模型后,希望能把这个模型文件(GLB格式)下载到自己的电脑上,方便后续离线查…

2026/7/9 22:19:43阅读更多 →
拼多多订单批量导出:3种方案对比(浏览器脚本 vs RPA vs 插件)

拼多多订单批量导出:3种方案对比(浏览器脚本 vs RPA vs 插件)

拼多多订单批量导出:3种技术方案深度评测与实战指南在电商运营和个人消费管理中,拼多多订单数据的高效导出已成为刚需。无论是个人用户的年度消费统计,还是电商从业者的供应链管理,从海量订单中提取结构化数据都面临着平台原生功能…

2026/7/9 22:19:43阅读更多 →
AI时代职业操作系统升级:从业务专家到人机协作架构师

AI时代职业操作系统升级:从业务专家到人机协作架构师

1. 这不是“学AI”,而是重建职业操作系统:一个真实从业者的12个月转型手记“我开始的12个月AI转型计划”——看到这个标题,你脑子里浮现的是什么?是深夜刷完三门大课后点开的Coursera证书?是收藏夹里积灰的“GPT提示词…

2026/7/9 23:34:50阅读更多 →
EXACT-MPPI:基于精确ESDF的确定性实时导航控制

EXACT-MPPI:基于精确ESDF的确定性实时导航控制

1. 项目概述:这不是又一个“端到端黑箱”,而是一次对局部导航底层物理约束的重新锚定“EXACT-MPPI”这个名称里藏着三把钥匙:EXACT指向数学上的精确性,不是近似、不是拟合、不是学习出来的统计规律;MPPI是模型预测路径…

2026/7/9 23:34:50阅读更多 →
TRAE SOLO:移动端原生Agent运行时与SOLO开发范式

TRAE SOLO:移动端原生Agent运行时与SOLO开发范式

1. 项目概述:为什么“随时随地跑 Agent”这件事,突然变得真实可感?“随时随地跑 Agent”——这句口号过去听起来像科幻预告片里的旁白,现在却成了我通勤地铁上、咖啡馆角落里、甚至出差酒店床头柜前的真实操作。TRAE SOLO 移动端不…

2026/7/9 23:34:50阅读更多 →
V2X通信安全:从消息认证到PKI证书体系的技术实现

V2X通信安全:从消息认证到PKI证书体系的技术实现

V2X通信安全:从消息认证到PKI证书体系的技术实现 2025年,某智能网联示范区在测试中发现了一个值得警惕的场景:攻击者在一台笔记本电脑上运行开源V2X协议栈,模拟RSU广播伪造的SPAT(信号灯相位与时序)消息。周…

2026/7/9 23:34:50阅读更多 →
TRAE SOLO模式:项目感知型AI编程的上下文编排协议

TRAE SOLO模式:项目感知型AI编程的上下文编排协议

1. TRAE 国际版 SOLO 模式到底在解决什么问题?TRAE 国际版 SOLO 模式不是又一个“AI 编程助手”的营销包装,它直指当前开发者在真实协作场景中一个被长期忽视的断层:单人深度编码时的上下文完整性与模型响应精准度之间的根本矛盾。我从2021年…

2026/7/9 23:34:50阅读更多 →
FAMILY W-1按摩椅操作器固件全集:NEC78K0S汇编源码+日文VFD驱动+字库与硬件控制模块

FAMILY W-1按摩椅操作器固件全集:NEC78K0S汇编源码+日文VFD驱动+字库与硬件控制模块

本文还有配套的精品资源,点击获取 简介:一套完整可运行的FAMILY W-1按摩椅操作器嵌入式固件,基于NEC UPD784218 16位单片机平台,全部用汇编语言实现。包含主程序入口MAIN.BAK、按键扫描(KEYHD.BAK/KEY_PRC.BAK&…

2026/7/9 23:29:49阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/9 5:56:19阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/9 9:45:20阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/9 2:47:07阅读更多 →
Three.js 着色器光效教程

Three.js 着色器光效教程

着色器光效 Shader Light ▶ 在线运行案例 案例合集: 三维可视化功能案例(threehub.cn)开源仓库github地址: https://github.com/z2586300277/three-cesium-examples400个案例代码: 网盘链接 你将学到什么 ShaderMaterial 自…

2026/7/9 0:04:37阅读更多 →
如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南

如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南

如何5分钟掌握CS2智能库存管理:开源工具CASEMOVE终极指南 【免费下载链接】casemove A dedicated desktop app that enables you to move items in and out of storage units in CS2. 项目地址: https://gitcode.com/gh_mirrors/ca/casemove 还在为CS2存储单…

2026/7/9 0:04:37阅读更多 →
GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比

GBase 8a vs MySQL 8.0:ALTER TABLE语法与限制的5点关键差异对比

GBase 8a与MySQL 8.0:ALTER TABLE语法差异深度解析与实战指南1. 两种数据库的ALTER TABLE能力全景对比在数据库架构设计和运维过程中,表结构变更(DDL操作)是不可避免的需求。GBase 8a作为国产分析型数据库代表,与开源M…

2026/7/9 0:04:37阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/9 9:45:20阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/9 15:50:44阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/9 14:14:17阅读更多 →