java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring WebService主流实现方式‌

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

作者:曹牧

文章介绍了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、‌注意事项‌

总结

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

您可能感兴趣的文章:
阅读全文