如何在Gradle中使用Apache CXF + Spring Boot构建SOAP WS?

时间:2018-04-16 22:56:58

标签: spring-boot gradle cxf

赋值很简单:使用Gradle实现的SOAP Web服务,使用Gradle实现JDBC。

经过一段时间的回顾,发现“ Spring-WS ”仅适用于契约优先开发风格。

我们不希望这样,所以我们进一步挖掘并发现我们已经知道的东西,我们必须使用Apache CXF来实现契约最后的开发风格。

关闭我们去搜索,编码和测试;但是一旦数据访问和外观完成,我们就无法弄清楚如何使用Spring Boot服务外观连接Apache CXF WS。

那么......怎么做的?

1 个答案:

答案 0 :(得分:0)

这更像是一个修辞问题,因为在环顾四周后我们找不到Spring Boot& amp; Apache CXF可以无缝地协同工作,因此对于任何可能正在搜索的人来说,这是一个简单的例子。

首先是Gradle项目使用的依赖项

build.gradle文件

buildscript {
        ext {
            springBootVersion = '2.0.1.RELEASE'
        }
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        }
    }

    apply plugin: 'java'
    apply plugin: 'eclipse-wtp'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'
    apply plugin: 'war'

    group = 'com.telcel'
    version = '0.0.1-RC'
    sourceCompatibility = 1.8

    repositories {
        mavenCentral()
    }

    configurations {
        providedRuntime
    }

    dependencies {
        // Apache CXF
        compile(group: 'org.apache.cxf', name: 'cxf-spring-boot-starter-jaxws', version: '3.1.15') {
            exclude(module: 'spring-boot-starter-tomcat')
        }

        // JDBC support
        compile('org.springframework.boot:spring-boot-starter-jdbc')

        // embedded servlet container
        compile group: 'org.springframework.boot', name: 'spring-boot-starter-undertow', version: '1.5.4.RELEASE'

        runtime group: 'com.ibm.informix', name: 'jdbc', version: '4.10.10.0'

        testCompile('org.springframework.boot:spring-boot-starter-test')
        testRuntime group: 'com.ibm.informix', name: 'jdbc', version: '4.10.10.0'
    }

然后,我们需要一些基本的东西用于CXF配置。

application.properties文件:

cxf.path=/service
server.address=0.0.0.0

我们需要Spring Boot来创建一个CXF端点,我们还需要那个端点来使用我们的Spring感知门面......这就是布线魔术发生的地方。

<强> WebServiceConfig.java

package com.telcel.validaserie;

import com.telcel.validaserie.ui.ValidaSerieEndpoint;
import org.apache.cxf.Bus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.xml.ws.Endpoint;

@Configuration
public class WebServiceConfig {

    @Autowired
    private Bus bus;

    @Autowired
    private ValidaSerieEndpoint validaSerieEndpoint;

    @Bean
    public Endpoint endpoint() {
        EndpointImpl endpoint = new EndpointImpl(bus, validaSerieEndpoint);
        endpoint.publish("/");
        return endpoint;
    }
}

注意自动连接的ValidaSerieEndpoint 作为参数进入 EndpointImpl构造函数,这就是技巧,简单明了。

最后只是一个简单的Web服务实现公开为Spring Bean(注意Spring @Service构造型

<强> ValidaSerieEndpoint.class

package com.telcel.validaserie.ui;

import com.telcel.validaserie.servicios.ValidaSeriesFacade;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

@Service
@WebService
public class ValidaSerieEndpoint {

    @Autowired
    private ValidaSeriesFacade validaSeriesFacade;

    @WebMethod
    public String validaTelefonoIccid(@WebParam(name = "iccid") String iccid) {
        return validaSeriesFacade.validaTelefonoIccid(iccid);
    }

    @WebMethod
    public String validaTelefonoImei(@WebParam(name = "imei") String imei) {
        return validaSeriesFacade.validaTelefonoImei(imei);
    }

    @WebMethod
    public int validaFacturaIccid(@WebParam(name = "iccid") String iccid, @WebParam(name = "fuerza-venta") String fuerzaVenta) {
        return validaSeriesFacade.validaFacturaIccid(iccid, fuerzaVenta);
    }

    @WebMethod
    public int validaFacturaImei(@WebParam(name = "imei") String imei, @WebParam(name = "fuerza-venta") String fuerzaVenta) {
        return validaSeriesFacade.validaFacturaImei(imei, fuerzaVenta);
    }

}

看完之后就很简单了......希望这会有所帮助。