springboot 整合webservice 相關說明

1.環境依賴 jdk8, springboot 2.3.12.release,cxf版本需要根據springboot版本修改,方法:查看springboot版本的發佈日期,然後根據日期找相近的兩個版本

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>2.3.12.RELEASE</version>
</dependency>

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

2. WebserviceConfig.java

 1 package com.example.demo.demos.nacosconfig;
 2 
 3 import javax.xml.ws.Endpoint;
 4 
 5 import org.apache.cxf.bus.spring.SpringBus;
 6 import org.apache.cxf.jaxws.EndpointImpl;
 7 import org.apache.cxf.transport.servlet.CXFServlet;
 8 import org.springframework.beans.factory.annotation.Autowired;
 9 import org.springframework.boot.web.servlet.ServletRegistrationBean;
10 import org.springframework.context.annotation.Bean;
11 import org.springframework.context.annotation.Configuration;
12 
13 import com.example.demo.demos.webservice.IUserWebService;
14 
15 @Configuration
16 public class WebServiceConfig {
17 
18   /************* 要發佈的webservice,需要有對應的實現類,建議參照下文中的命名規範 ****************/
19     @Autowired
20     private IUserWebService webService;
21 
22     @SuppressWarnings({ "rawtypes", "unchecked" })
23     @Bean
24     public ServletRegistrationBean cxfServlet() {
25         return new ServletRegistrationBean(new CXFServlet(), "/ws/*");
26     }
27 
28     @Bean
29     public SpringBus cxf() {
30         return new SpringBus();
31     }
32 
33     @Bean
34     public Endpoint endpoint() {
35         EndpointImpl endpoint = new EndpointImpl(cxf(), webService);
36         endpoint.publish("/api");
37         return endpoint;
38     }
39 }
View Code

3. 接口示例和規範

 1 package com.example.demo.demos.webservice;
 2 
 3 import javax.jws.WebMethod;
 4 import javax.jws.WebService;
 5 
 6 /**
 7  * name決定了生成的相關調用代碼是否簡單明瞭且符合上下文語境<br/>
 8  * targetNamespace 無所謂,和實現類一致即可
 9  * @author Administrator
10  *
11  */
12 @WebService(name = "userService", targetNamespace = "https://www.demo.tech")
13 public interface IUserWebService {
14 
15     @WebMethod
16     public String sayHello(String name);
17 }
View Code

4.實現類

 1 package com.example.demo.demos.webservice.impl;
 2 
 3 import javax.jws.WebService;
 4 
 5 import org.springframework.stereotype.Component;
 6 
 7 import com.example.demo.demos.webservice.IUserWebService;
 8 
 9 /**
10  * 
11  * class 類名如下,去掉接口中的首字母'I'和結尾單詞'Service'<br/>
12  * 生成的調用代碼語境就比較通順
13  * 
14  * @author Administrator
15  *
16  */
17 @Component
18 @WebService(targetNamespace = "https://www.demo.tech", endpointInterface = "com.example.demo.demos.webservice.IUserWebService")
19 public class UserWeb implements IUserWebService {
20 
21     public String sayHello(String name) {
22         return String.format("hello,%s", name);
23     }
24 }
View Code

5. 打開要生成的文件夾,即生成的代碼要保存到哪裏就打開哪個文件夾,然後運行命令 wsimport  -encoding UTF-8 -s . http://127.0.0.1:8080/ws/api?wsdl 自動生成java相關代碼

6. 測試代碼就會變得語境通順

 1 package com.example.demo;
 2 
 3 import java.net.MalformedURLException;
 4 import java.net.URL;
 5 
 6 import javax.xml.namespace.QName;
 7 import javax.xml.ws.Service;
 8 
 9 import https.www_zqxx.UserService;
10 
11 public class WebServiceTest {
12     public static void main(String[] args) throws MalformedURLException {
13         System.setProperty("javax.xml.bind.JAXBContext", "com.sun.xml.internal.bind.v2.ContextFactory");
14         // 創建WSDL的URL
15         URL url = new URL("http://localhost:8080/ws/api?wsdl");
16         // 指定命名空間和服務名稱
17         QName qName = new QName("https://www.demo.tech", "UserWebService");
18         Service service = Service.create(url, qName);
19         // 通過getPort方法返回指定接口
20         UserService userService = service.getPort(UserService.class);
21         String res = userService.sayHello("小明");
22         System.out.println(res);
23     }
24 }
View Code

 7. 統一封裝結果類

package com.zqxxjs.v1.common;

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name = "ResponseEntity")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "code", "msg", "result" })
public class ResponseEntity<T> {

    private Integer code;
    private String msg;

    private Message<T> result;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Message<T> getResult() {
        return result;
    }

    public void setResult(Message<T> result) {
        this.result = result;
    }

    public static <E> ResponseEntity<E> success(List<E> data, Long count) {
        ResponseEntity<E> entity = new ResponseEntity<>();
        entity.setCode(Constant.SUCCESS_CODE);
        entity.setMsg(Constant.SUCCESS_MSG);
        Message<E> resultTmp = new Message<>();
        resultTmp.setCount(count);
        resultTmp.setData(data);
        entity.setResult(resultTmp);
        return entity;
    }

}
View Code

8. 配合mbg插件,在生成的實體類上邊要加的相關注解,註解生成工具:

package com.zqxxjs.order.common;

import java.io.File;
import java.lang.reflect.Field;
import java.util.Collection;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;

public class XmlUtil {
    public static void main(String[] args) throws Exception {
        String packageName="com.zqxxjs.order.entity";
        String path = Thread.currentThread().getContextClassLoader().getResource(packageName.replace(".", "/")).getPath();
        Collection<File> entityClassFile = FileUtils.listFiles(new File(path), new String[] { "class" }, false);
        for (File file : entityClassFile) {
            if (file.getName().contains("Example")) {
                continue;
            }
            Class<?> c = Class.forName(packageName+"." + FilenameUtils.getBaseName(file.getName()));
            Field[] fds = c.getDeclaredFields();
            String s = ("@XmlType(propOrder = { ");
            String[] tmp = new String[fds.length - 1];
            for (int i = 0; i < tmp.length; i++) {
                Field f = fds[i];
                if (f.getName().equalsIgnoreCase("serialVersionUID")) {
                    continue;
                }

                tmp[i] = String.format("\"%s\"", f.getName());
            }
            
            
            System.out.println("\n\n@XmlRootElement(name = \""+c.getSimpleName()+"\")");
            System.out.println("@XmlAccessorType(XmlAccessType.FIELD)");
            s = s.concat(String.join(",", tmp)).concat("})");
            System.out.println(s);
            System.out.println("-----------------------------------------------------------------");
        }

    }
}
View Code

9. 加好後的示例代碼

package com.zqxxjs.v1.entity;

import java.io.Serializable;
import java.math.BigDecimal;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

/**
 *
 * This class was generated by MyBatis Generator. This class corresponds to the
 * database table finance_account_info
 */

@XmlRootElement(name = "FinanceAccountInfo")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "id", "serialNumber", "projectNumber", "projectName", "director", "amountOfMoney", "createDate",
        "financeNumber", "remark" })
public class FinanceAccountInfo implements Serializable {
    /**
     *
     * This field was generated by MyBatis Generator. This field corresponds to the
     * database column finance_account_info.id
     *
     * @mbg.generated
     */
    private Integer id;

    /**
     * Database Column Remarks: 流水號
     *
     * This field was generated by MyBatis Generator. This field corresponds to the
     * database column finance_account_info.serial_number
     *
     * @mbg.generated
     */
    private String serialNumber;

    /**
     * Database Column Remarks: 項目編號
     *
     * This field was generated by MyBatis Generator. This field corresponds to the
     * database column finance_account_info.project_number
     *
     * @mbg.generated
     */
    private String projectNumber;

    /**
     * Database Column Remarks: 項目名稱
     *
     * This field was generated by MyBatis Generator. This field corresponds to the
     * database column finance_account_info.project_name
     *
     * @mbg.generated
     */
    private String projectName;

    /**
     * Database Column Remarks: 負責人
     *
     * This field was generated by MyBatis Generator. This field corresponds to the
     * database column finance_account_info.director
     *
     * @mbg.generated
     */
    private String director;

    /**
     * Database Column Remarks: 金額
     *
     * This field was generated by MyBatis Generator. This field corresponds to the
     * database column finance_account_info.amount_of_money
     *
     * @mbg.generated
     */
    private BigDecimal amountOfMoney;

    /**
     * Database Column Remarks: 往來日期
     *
     * This field was generated by MyBatis Generator. This field corresponds to the
     * database column finance_account_info.create_date
     *
     * @mbg.generated
     */
    private String createDate;

    /**
     * Database Column Remarks: 財務編號
     *
     * This field was generated by MyBatis Generator. This field corresponds to the
     * database column finance_account_info.finance_number
     *
     * @mbg.generated
     */
    private String financeNumber;

    /**
     * Database Column Remarks: 備註
     *
     * This field was generated by MyBatis Generator. This field corresponds to the
     * database column finance_account_info.remark
     *
     * @mbg.generated
     */
    private String remark;

    /**
     * This field was generated by MyBatis Generator. This field corresponds to the
     * database table finance_account_info
     *
     * @mbg.generated
     */
    private static final long serialVersionUID = 1L;

    /**
     * This method was generated by MyBatis Generator. This method returns the value
     * of the database column finance_account_info.id
     *
     * @return the value of finance_account_info.id
     *
     * @mbg.generated
     */
    public Integer getId() {
        return id;
    }

    /**
     * This method was generated by MyBatis Generator. This method sets the value of
     * the database column finance_account_info.id
     *
     * @param id the value for finance_account_info.id
     *
     * @mbg.generated
     */
    public void setId(Integer id) {
        this.id = id;
    }

    /**
     * This method was generated by MyBatis Generator. This method returns the value
     * of the database column finance_account_info.serial_number
     *
     * @return the value of finance_account_info.serial_number
     *
     * @mbg.generated
     */
    public String getSerialNumber() {
        return serialNumber;
    }

    /**
     * This method was generated by MyBatis Generator. This method sets the value of
     * the database column finance_account_info.serial_number
     *
     * @param serialNumber the value for finance_account_info.serial_number
     *
     * @mbg.generated
     */
    public void setSerialNumber(String serialNumber) {
        this.serialNumber = serialNumber;
    }

    /**
     * This method was generated by MyBatis Generator. This method returns the value
     * of the database column finance_account_info.project_number
     *
     * @return the value of finance_account_info.project_number
     *
     * @mbg.generated
     */
    public String getProjectNumber() {
        return projectNumber;
    }

    /**
     * This method was generated by MyBatis Generator. This method sets the value of
     * the database column finance_account_info.project_number
     *
     * @param projectNumber the value for finance_account_info.project_number
     *
     * @mbg.generated
     */
    public void setProjectNumber(String projectNumber) {
        this.projectNumber = projectNumber;
    }

    /**
     * This method was generated by MyBatis Generator. This method returns the value
     * of the database column finance_account_info.project_name
     *
     * @return the value of finance_account_info.project_name
     *
     * @mbg.generated
     */
    public String getProjectName() {
        return projectName;
    }

    /**
     * This method was generated by MyBatis Generator. This method sets the value of
     * the database column finance_account_info.project_name
     *
     * @param projectName the value for finance_account_info.project_name
     *
     * @mbg.generated
     */
    public void setProjectName(String projectName) {
        this.projectName = projectName;
    }

    /**
     * This method was generated by MyBatis Generator. This method returns the value
     * of the database column finance_account_info.director
     *
     * @return the value of finance_account_info.director
     *
     * @mbg.generated
     */
    public String getDirector() {
        return director;
    }

    /**
     * This method was generated by MyBatis Generator. This method sets the value of
     * the database column finance_account_info.director
     *
     * @param director the value for finance_account_info.director
     *
     * @mbg.generated
     */
    public void setDirector(String director) {
        this.director = director;
    }

    /**
     * This method was generated by MyBatis Generator. This method returns the value
     * of the database column finance_account_info.amount_of_money
     *
     * @return the value of finance_account_info.amount_of_money
     *
     * @mbg.generated
     */
    public BigDecimal getAmountOfMoney() {
        return amountOfMoney;
    }

    /**
     * This method was generated by MyBatis Generator. This method sets the value of
     * the database column finance_account_info.amount_of_money
     *
     * @param amountOfMoney the value for finance_account_info.amount_of_money
     *
     * @mbg.generated
     */
    public void setAmountOfMoney(BigDecimal amountOfMoney) {
        this.amountOfMoney = amountOfMoney;
    }

    /**
     * This method was generated by MyBatis Generator. This method returns the value
     * of the database column finance_account_info.create_date
     *
     * @return the value of finance_account_info.create_date
     *
     * @mbg.generated
     */
    public String getCreateDate() {
        return createDate;
    }

    /**
     * This method was generated by MyBatis Generator. This method sets the value of
     * the database column finance_account_info.create_date
     *
     * @param createDate the value for finance_account_info.create_date
     *
     * @mbg.generated
     */
    public void setCreateDate(String createDate) {
        this.createDate = createDate;
    }

    /**
     * This method was generated by MyBatis Generator. This method returns the value
     * of the database column finance_account_info.finance_number
     *
     * @return the value of finance_account_info.finance_number
     *
     * @mbg.generated
     */
    public String getFinanceNumber() {
        return financeNumber;
    }

    /**
     * This method was generated by MyBatis Generator. This method sets the value of
     * the database column finance_account_info.finance_number
     *
     * @param financeNumber the value for finance_account_info.finance_number
     *
     * @mbg.generated
     */
    public void setFinanceNumber(String financeNumber) {
        this.financeNumber = financeNumber;
    }

    /**
     * This method was generated by MyBatis Generator. This method returns the value
     * of the database column finance_account_info.remark
     *
     * @return the value of finance_account_info.remark
     *
     * @mbg.generated
     */
    public String getRemark() {
        return remark;
    }

    /**
     * This method was generated by MyBatis Generator. This method sets the value of
     * the database column finance_account_info.remark
     *
     * @param remark the value for finance_account_info.remark
     *
     * @mbg.generated
     */
    public void setRemark(String remark) {
        this.remark = remark;
    }
}
View Code

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章