Spring WebService的两种主流实现方式‌及说明

 更新时间:2026年04月27日 11:11:46   作者:曹牧  
文章介绍了Spring Web Services(Spring-WS)和Spring Boot + Apache CXF两种主流的Web服务实现方式,Spring-WS采用ContractFirst方式,适合企业级、高可维护性的SOAP服务;Spring Boot + CXF采用ContractLast方式,开发更快,适合快速原型或内部系统集成

Spring WebService主流实现方式‌

Spring-WS(Spring Web Services)‌:采用 ‌Contract First(自顶向下)‌ 方式,先定义 XSD/WSDL,再生成 Java 代码。适用于企业级、高可维护性的 SOAP 服务。

Spring Boot + JAX-WS(通常用 Apache CXF)‌:采用 ‌Contract Last(自底向上)‌ 方式,通过 @WebService 注解将 Java 类暴露为 Web Service。开发更快速,适合快速原型或内部系统集成。

1、‌Spring-WS(Contract First)核心步骤‌

添加依赖‌(Maven):

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web-services</artifactId>
    </dependency>
    <dependency>
        <groupId>wsdl4j</groupId>
        <artifactId>wsdl4j</artifactId>
    </dependency>

定义 XSD Schema‌(如 src/main/resources/xsd/login.xsd):

<xs:schema targetNamespace="http://example.com/ws/login"
               elementFormDefault="qualified"
               xmlns:xs="http://www.w3.org/2001/XMLSchema">
        <xs:element name="loginRequest">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="username" type="xs:string"/>
                    <xs:element name="password" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
        <xs:element name="loginResponse">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="result" type="xs:string"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    </xs:schema>

自动生成 Java 类‌(使用 JAXB2 Maven 插件):

<plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>jaxb2-maven-plugin</artifactId>
        <version>1.6</version>
        <configuration>
            <schemaDirectory>${project.basedir}/src/main/resources/xsd/</schemaDirectory>
            <outputDirectory>${project.basedir}/src/main/java/</outputDirectory>
        </configuration>
        <executions>
            <execution>
                <goals><goal>xjc</goal></goals>
            </execution>
        </executions>
    </plugin>

创建 Endpoint‌:

@Endpoint
    public class LoginEndpoint {
        private static final String NAMESPACE_URI = "http://example.com/ws/login";
        @PayloadRoot(namespace = NAMESPACE_URI, localPart = "loginRequest")
        @ResponsePayload
        public LoginResponse login(@RequestPayload LoginRequest request) {
            // 业务逻辑
            LoginResponse response = new LoginResponse();
            response.setResult("success");
            return response;
        }
    }

配置 WebServiceConfig‌:

    @Configuration
    @EnableWs
    public class WebServiceConfig extends WsConfigurerAdapter {
        @Bean
        public ServletRegistrationBean messageDispatcherServlet(ApplicationContext context) {
            MessageDispatcherServlet servlet = new MessageDispatcherServlet();
            servlet.setApplicationContext(context);
            servlet.setTransformWsdlLocations(true);
            return new ServletRegistrationBean(servlet, "/ws/*");
        }
        @Bean(name = "login")
        public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema schema) {
            DefaultWsdl11Definition wsdl = new DefaultWsdl11Definition();
            wsdl.setPortTypeName("loginPort");
            wsdl.setLocationUri("/ws");
            wsdl.setSchema(schema);
            return wsdl;
        }
        @Bean
        public XsdSchema schema() {
            return new SimpleXsdSchema(new ClassPathResource("xsd/login.xsd"));
        }
    }

访问 WSDL‌:

启动应用后,访问 http://localhost:8080/ws/login.wsdl 查看服务描述。

2、‌Spring Boot + CXF(Contract Last)

添加依赖‌:

    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
        <version>3.3.1</version>
    </dependency>

定义接口与实现类‌:

    @WebService
    public interface OrderWS {
        @WebMethod
        Order getOrderById(int id);
    }
    @WebService(endpointInterface = "com.example.OrderWS")
    public class OrderWSImpl implements OrderWS {
        @Override
        public Order getOrderById(int id) {
            return new Order(id, "Product", 999.99);
        }
    }

配置发布端点‌:

    @Configuration
    public class WebServiceConfig {
        @Autowired
        private OrderWSImpl orderWSImpl;
        @Bean
        public Endpoint endpoint() {
            EndpointImpl endpoint = new EndpointImpl(new SpringBus(), orderWSImpl);
            endpoint.publish("/orderws");
            return endpoint;
        }
    }

访问 WSDL‌:

http://localhost:8080/orderws?wsdl

3、‌注意事项‌

  • Spring-WS‌ 更适合需要严格契约控制、长期维护的系统。
  • CXF + JAX-WS‌ 开发更快,但耦合度较高,适合内部服务或快速迭代场景。
  • 避免使用过时的 Axis1/Axis2,除非维护遗留系统 ‌。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • windows java.exe内存暴涨解决、idea跑java\ tomcat内存无限增长

    windows java.exe内存暴涨解决、idea跑java\ tomcat内存无限增长

    这篇文章主要介绍了windows java.exe内存暴涨解决、idea跑 java\ tomcat内存无限增长,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Java利用跳跃表解决双重队列问题详解

    Java利用跳跃表解决双重队列问题详解

    这篇文章主要为大家详细介绍了Java如何利用跳跃表来解决双重队列的问题。本文通过一个简单的例题进行了讲解,感兴趣的小伙伴可以了解一下
    2022-12-12
  • Java日常练习题,每天进步一点点(19)

    Java日常练习题,每天进步一点点(19)

    下面小编就为大家带来一篇Java基础的几道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • java struts2框架简介

    java struts2框架简介

    本文主要介绍了java struts2框架的基础知识。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • java 抽象类与接口的区别总结

    java 抽象类与接口的区别总结

    这篇文章主要介绍了java 抽象类与接口的区别总结的相关资料,需要的朋友可以参考下
    2017-02-02
  • Java 详解异常的处理机制

    Java 详解异常的处理机制

    异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。比如你的代码少一个分号,那运行出来结果是提示是错误 java.lang.Error;如果你用System.out.println(11/0),那你是因为用0做了除数,会抛出 java.lang.ArithmeticException 的异常
    2021-11-11
  • 详解Java的call by value和call by reference

    详解Java的call by value和call by reference

    在本篇文章里小编给大家总结了关于Java的call by value和call by reference的相关用法和知识点内容,需要的朋友们学习下。
    2019-03-03
  • Java多线程编程之ThreadLocal详解

    Java多线程编程之ThreadLocal详解

    这篇文章主要介绍了Java多线程编程之ThreadLocal详解,ThreadLocal是Java中的一个线程局部变量,该变量在多线程并发执行时,为每个线程都提供了一个独立的副本,简单来说,ThreadLocal提供了一种在多线程环境中,使每个线程绑定自己独立的变量的方法,需要的朋友可以参考下
    2023-09-09
  • 使用SpringBoot找不到Mapper的Bean问题及解决

    使用SpringBoot找不到Mapper的Bean问题及解决

    这篇文章主要介绍了使用SpringBoot找不到Mapper的Bean问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-04-04
  • Maven项目中读取src/main/resources目录下的配置文件的方法

    Maven项目中读取src/main/resources目录下的配置文件的方法

    本篇文章主要介绍了Maven项目中读取src/main/resources目录下的配置文件的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12

最新评论