Implementación Spring Boot cxf de inicio rápido de WebService

Hablando de servicios web que se han vuelto populares en los últimos años, existe una tendencia a reemplazar los servicios web tradicionales de jabones, sin embargo, algunos sistemas únicos o relativamente antiguos todavía usan servicios web jabones tradicionales, como las interfaces de consulta de boletos de aerolíneas y aerolíneas. Este artículo explica principalmente el servicio de servicio web de lanzamiento de Spring Boot Integration Cxf y el servicio de servicio web de Spring Boot Integration Cxf Client Call Service.

dependencia de Maven

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jetty</artifactId>
    </dependency>

    <!-- CXF webservice -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
        <version>3.2.4</version>
    </dependency>
    <!-- CXF webservice -->

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest-all</artifactId>
        <version>1.3</version>
        <scope>test</scope>
    </dependency>
</dependencies>

Interfaz de servicio

Primero defina una clase de usuario simple Usuario:

package com.xncoding.webservice.model;

public class User {
    private Long id;
    private String name;
    private Integer age;

    public User() {
    }

    public User(Long id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    // getter and setter
}

Tenga en cuenta que el nombre del paquete anterior es el orden inverso del targetNamespace definido por la interfaz a continuación.

Cree una interfaz de servicio simple, defina dos métodos, uno devuelve una cadena, uno devuelve una clase de entidad Usuario:

package com.xncoding.webservice.service;

import com.xncoding.webservice.model.User;

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

@WebService(name = "CommonService", // 暴露服务名称
        targetNamespace = "http://model.webservice.xncoding.com/"// 命名空间,一般是接口的包名倒序
)
public interface ICommonService {
    @WebMethod
    public String sayHello(@WebParam(name = "userName") String name);

    @WebMethod
    public User getUser(@WebParam(name = "userName") String name);
}

Implementación de interfaz

Luego implemente esta interfaz y escriba la lógica de negocios correspondiente:

package com.xncoding.webservice.service.impl;

import com.xncoding.webservice.model.User;
import com.xncoding.webservice.service.ICommonService;
import org.springframework.stereotype.Component;

import javax.jws.WebService;

@WebService(serviceName = "CommonService", // 与接口中指定的name一致
        targetNamespace = "http://model.webservice.xncoding.com/", // 与接口中的命名空间一致,一般是接口的包名倒
        endpointInterface = "com.xncoding.webservice.service.ICommonService"// 接口地址
)
@Component
public class CommonServiceImpl implements ICommonService {

    
    public String sayHello(String name) {
        return "Hello ," + name;
    }

    
    public User getUser(String name) {
        return new User(1000L, name, 23);
    }
}

Clase de configuración

Luego escriba la clase de configuración de cxf:

@Configuration
public class CxfConfig {
    @Autowired
    private Bus bus;

    @Autowired
    ICommonService commonService;

    /**
     * JAX-WS
     **/
    @Bean
    public Endpoint endpoint() {
        EndpointImpl endpoint = new EndpointImpl(bus, commonService);
        endpoint.publish("/CommonService");
        return endpoint;
    }
}

Aquí la Commonserviceinterfaz se publica bajo la ruta /services/CommonService, la ruta del documento wsdl eshttp://localhost:{port}/services/CommonService?wsdl

Si desea personalizar la URL de acceso de wsdl, puede personalizarla en application.yml:

cxf:
  path: /services  # 替换默认的/services路径

Cliente directa Hay dos formas de acceder al acceso de los clientes

Agente de fábrica

Este método necesita obtener la interfaz de la otra parte

@Test
public void cl1() {
    try {
        // 接口地址
        // 代理工厂
        JaxWsProxyFactoryBean jaxWsProxyFactoryBean = new JaxWsProxyFactoryBean();
        // 设置代理地址
        jaxWsProxyFactoryBean.setAddress(wsdlAddress);
        // 设置接口类型
        jaxWsProxyFactoryBean.setServiceClass(ICommonService.class);
        // 创建一个代理接口实现
        ICommonService cs = (ICommonService) jaxWsProxyFactoryBean.create();
        // 数据准备
        String userName = "Leftso";
        // 调用代理接口的方法调用并返回结果
        String result = cs.sayHello(userName);
        System.out.println("返回结果:" + result);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Método de llamada dinámica 

public void cl3() {
    // 创建动态客户端
    JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
    Client client = dcf.createClient(wsdlAddress);
    Object[] objects;
    try {
        // invoke("方法名",参数1,参数2,参数3....);
        objects = client.invoke("getUser", "张三");
        System.out.println("返回类型:" + objects[0].getClass());
        System.out.println("返回数据:" + objects[0]);
        User user = (User) objects[0];
        System.out.println("返回对象User.name=" + user.getName());
    } catch (java.lang.Exception e) {
        e.printStackTrace();
    }
}

Tenga en cuenta que si el método devuelve un objeto, entonces el paquete del objeto debe estar en orden inverso al targetNamespace.

Generar código de cliente

Esta es la forma recomendada de generar código de cliente basado en la ruta de acceso de wsdl. Hay dos métodos de generación.

Herramienta wsdl2java de Apache

wsdl2java -autoNameResolution http://xxx?wsdl

JDK viene con herramientas (recomendado)

JDK tiene una herramienta incorporada wsimport, que es la forma recomendada de generar.

wsimport -encoding utf-8 -p com.xncoding.webservice.client -keep http://xxx?wsdl -s d:/ws -B-XautoNameResolution

Entre ellos: 

-encoding :指定编码格式(此处是utf-8的指定格式)
-keep:是否生成Java源文件
-s:指定.java文件的输出目录
-d:指定.class文件的输出目录
-p:定义生成类的包名,不定义的话有默认包名
-verbose:在控制台显示输出信息
-b:指定jaxws/jaxb绑定文件或额外的schemas
-extension:使用扩展来支持SOAP1.2

 El comando anterior d:/wsgenerará el código de cliente correspondiente en el directorio.

Ejemplos de uso del cliente:

CommonService_Service c = new CommonService_Service();
com.xncoding.webservice.client.User user = c.getCommonServiceImplPort().getUser("Tom");
assertThat(user.getName(), is("Tom"));

Fuente de GitHub

springboot-cxf

Publicados 203 artículos originales · ganado elogios 6 · vistas 4475

Supongo que te gusta

Origin blog.csdn.net/weixin_42073629/article/details/105609303
Recomendado
Clasificación