Spring 源码硬核解析系列专题(十八):Spring Web Services 的 SOAP 服务 ...

打印 上一主题 下一主题

主题 1751|帖子 1751|积分 5253

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在前几期中,我们从 Spring 焦点到 Spring Boot 的多个模块,再到 Spring Session,逐步展现了 Spring 生态在分布式系统中的广泛应用。Spring Web Services(Spring WS)是 Spring 提供的一个轻量级 Web 服务框架,专注于 SOAP(简单对象访问协议)服务。本篇将深入 Spring Web Services 的源码,分析其焦点机制与实现原理,并增补图示。
1. Spring Web Services 的焦点概念

Spring WS 是一个基于左券优先(Contract-First)的 SOAP 服务框架,焦点概念包罗:


  • MessageDispatcher:分发 SOAP 哀求。
  • Endpoint:处理 SOAP 哀求的业务逻辑。
  • WebServiceMessage:抽象 SOAP 消息。
  • MessageContext:哀求和响应的上下文。
  • WSDL:定义服务左券。
Spring WS 集成 Spring MVC,通过拦截器和端点映射实现机动的 SOAP 处理。
2. Spring Web Services 的基本设置

一个典范的 Spring Boot 设置:
  1. @SpringBootApplication
  2. @EnableWs
  3. @Configuration
  4. public class MyApplication {
  5.    
  6.     public static void main(String[] args) {
  7.    
  8.         SpringApplication.run(MyApplication.class, args);
  9.     }
  10.     @Bean
  11.     public ServletRegistrationBean<MessageDispatcherServlet> messageDispatcherServlet(ApplicationContext context) {
  12.    
  13.         MessageDispatcherServlet servlet = new MessageDispatcherServlet();
  14.         servlet.setApplicationContext(context);
  15.         servlet.setTransformWsdlLocations(true);
  16.         return new ServletRegistrationBean<>(servlet, "/ws/*");
  17.     }
  18.     @Bean(name = "userService")
  19.     public DefaultWsdl11Definition wsdl11Definition(XsdSchema schema) {
  20.    
  21.         DefaultWsdl11Definition wsdl = new DefaultWsdl11Definition();
  22.         wsdl.setPortTypeName("UserServicePort");
  23.         wsdl.setLocationUri("/ws");
  24.         wsdl.setTargetNamespace("http://example.com/userservice");
  25.         wsdl.setSchema(schema);
  26.         return wsdl;
  27.     }
  28.     @Bean
  29.     public XsdSchema userSchema() {
  30.    
  31.         return new SimpleXsdSchema(new ClassPathResource("user.xsd"));
  32.     }
  33. }
  34. @Endpoint
  35. public class UserEndpoint {
  36.    
  37.     @PayloadRoot(namespace = "http://example.com/userservice", localPart = "getUserRequest")
  38.     @ResponsePayload
  39.     public GetUserResponse getUser(@RequestPayload GetUserRequest request) {
  40.    
  41.         GetUserResponse response = new GetUserResponse();
  42.         response.setName("User-" + request.getId());
  43.         return response;
  44.     }
  45. }
复制代码


  • @EnableWs:启用 Web 服务支持。
  • MessageDispatcherServlet:处理 SOAP 哀求。
  • @Endpoint:定义 SOAP 端点。
user.xsd 示例:
  1. <xs:schema xmlns:xs
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

兜兜零元

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表