Spring Boot 開發 WebService 服務


WebService 雖然現在大部分互聯網企業不太提倡使用,但在以第三方接口為主導的市場,對方來什么接口你還得用什么接口,不可能把接口重寫了。例如大部分傳統的大型企業都在用 WebService,並且版本還不一樣。

本章主要介紹在 Spring Boot 下有常用的整合 WebService 的方法並給出示例。為了方便測試,本章有兩個獨立的項目

  1. 用戶的獲取、增加、更新、刪除 webservice 服務
  2. 用於調用 1 的webservice 服務的客戶端

本項目源碼 github 下載

1 新建 Spring Boot Maven 示例工程項目

注意:是用來 IDEA 開發工具

  1. File > New > Project,如下圖選擇 Spring Initializr 然后點擊 【Next】下一步
  2. 填寫 GroupId(包名)、Artifact(項目名) 即可。點擊 下一步
    groupId=com.fishpro
    artifactId=webservice
  3. 選擇依賴 Spring Web Starter 前面打鈎。
  4. 項目名設置為 spring-boot-study-webservice.

2 引入依賴 Pom.xml

這里主要是引入 org.apache.cxf

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-spring-boot-starter-jaxws -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
            <version>3.2.5</version>
        </dependency>

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

3 編寫一個用戶獲取、新增、修改、刪除服務

3.1 傳輸對象 UserDto

通常我們把展示層與服務層之間傳輸的對象使用Dto后綴來標識。

UserDto(路徑 src/main/java/com/fishpro/webservice/dto/UserDto.java)


/**
 * 用戶傳輸實體對象 通常我們把展示層與服務層之間傳輸的對象使用Dto后綴來標識。
 * */
public class UserDto {

    private Integer userId;//用戶id
    private String userName;//用戶名稱
    private String password;//用戶密碼
    private Integer sex;//用戶性別 0女 1男

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getSex() {
        return sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }
}

3.2 用戶服務類

UserService 接口類(路徑 src/main/java/com/fishpro/webservice/service/UserService.java)

/**
 * 用戶服務類 必須使用 @WebService
 * */
@WebService(targetNamespace = WsConst.NAMESPACE_URI ,name = "userPortType")
public interface UserService {
    /**
     * 根據用戶id獲取用戶信息
     * */
    @WebMethod(operationName="getUserById")
    UserDto get(@WebParam(name = "id")  String id);

    /**
     * 獲取全部用戶信息
     * */
    @WebMethod(operationName="getUsers")
    List<UserDto> list();

    /**
     * 獲取用戶數
     * */
    @WebMethod(operationName="count")
    int count(@);

    /**
     * 新增用戶
     * */
    @WebMethod(operationName="save")
    int save(@WebParam(name = "user")  UserDto user);

    /**
     * 更新用戶
     * */
    @WebMethod(operationName="update")
    int update(@WebParam(name = "user")  UserDto user);

    /**
     * 刪除用戶
     * */
    @WebMethod(operationName="remove")
    int remove(@WebParam(name = "id")  Integer id);

    /**
     * 批量刪除用戶
     * */
    @WebMethod(operationName="batchRemove")
    int batchRemove(@WebParam(name = "ids")  Integer[] ids);
}

UserServiceImpl 接口類(路徑 src/main/java/com/fishpro/webservice/service/UserServiceImpl.java)


@WebService(
        targetNamespace = WsConst.NAMESPACE_URI, //wsdl命名空間
        name = "userPortType",                 //portType名稱 客戶端生成代碼時 為接口名稱
        serviceName = "userService",           //服務name名稱
        portName = "userPortName",             //port名稱
        endpointInterface = "com.fishpro.webservice.service.UserService")//指定發布webservcie的接口類,此類也需要接入@WebService注解
public class UserServiceImpl implements UserService {

    @Override
    public UserDto get(String id){
        if(null==id){
            return  null;
        }

        List<UserDto> list= getData();
        UserDto UserDto=null;
        for (UserDto user:list
                ) {
            if(id.equals(user.getUserId().toString())){
                UserDto=user;
                break;
            }
        }

        return UserDto;
    }

    @Override
    public List<UserDto> list(){
        List<UserDto> list=new ArrayList<>();

        list=getData();

        return list;
    }

    @Override
    public int count(){
        return getData().size();
    }

    @Override
    public int save(UserDto user){
        return 1;
    }

    @Override
    public int update(UserDto user){
        return 1;
    }

    @Override
    public int remove(Integer id){
        return 1;
    }

    @Override
    public int batchRemove(Integer[] ids){
        return 1;
    }

    /**
     * 模擬一組數據
     * */
    private List<UserDto> getData(){
        List<UserDto> list=new ArrayList<>();

        UserDto UserDto=new UserDto();
        UserDto.setUserId(1);
        UserDto.setUserName("admin");
        list.add(UserDto);

        UserDto=new UserDto();
        UserDto.setUserId(2);
        UserDto.setUserName("heike");
        list.add(UserDto);

        UserDto=new UserDto();
        UserDto.setUserId(3);
        UserDto.setUserName("tom");
        list.add(UserDto);

        UserDto=new UserDto();
        UserDto.setUserId(4);
        UserDto.setUserName("mac");
        list.add(UserDto);

        return  list;
    }

}

4 服務發布

編寫 CxfWebServiceConfig(路徑 src/main/java/com/fishpro/webservice/config/CxfWebServiceConfig.java)

import com.fishpro.websevice.service.UserService;
import com.fishpro.websevice.service.impl.UserServiceImpl;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.xml.ws.Endpoint;

@Configuration
public class CxfWebServiceConfig {

   /**
    *
    * */
   @Bean("cxfServletRegistration")
   public ServletRegistrationBean dispatcherServlet(){

       return new ServletRegistrationBean(new CXFServlet(),"/ws/*");
   }
   /**
    * 申明業務處理類 當然也可以直接 在實現類上標注 @Service
    */
   @Bean
   public UserService userService() {
       return new UserServiceImpl();
   }

   /*
    * 非必要項
    */
   @Bean(name = Bus.DEFAULT_BUS_ID)
   public SpringBus springBus() {
       SpringBus springBus = new SpringBus();
       return springBus;
   }

   /*
    * 發布endpoint
    */
   @Bean
   public Endpoint endpoint( ) {
       EndpointImpl endpoint = new EndpointImpl(springBus(), userService());
       endpoint.publish("/user");//發布地址
       return endpoint;
   }
}

打開瀏覽器輸入 http://localhost:8080/ws/user?wsdl 可以見到發布的效果

如何使用 Spring Boot 調用 WebService ,請閱讀 Spring Boot 使用 CXF 調用 WebService 服務

5 問題

  1. cxf 的服務方法中,是不能使用java.util.Map作為參數的,因為本身不支持轉換
    cxf對很多復雜類型支持並不友好,建議參數能使用簡單的類型,就使用簡單的類型

本項目源碼 github 下載


參考:

https://github.com/apache/cxf
[https://blog.lqdev.cn/2018/11/12/springboot/chapter-thirty-four/]https://blog.lqdev.cn/2018/11/12/springboot/chapter-thirty-four/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM