文件:https://github.com/xiaozhengyu/SpringBoot.git

WebService远程服务端

1、新建工程service,最终工程如下:


2、添加依赖包,pom.xml内容如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 4     <modelVersion>4.0.0</modelVersion>
 5     <parent>
 6         <groupId>org.springframework.boot</groupId>
 7         <artifactId>spring-boot-starter-parent</artifactId>
 8         <version>2.2.5.RELEASE</version>
 9         <relativePath/> <!-- lookup parent from repository -->
10     </parent>
11     <groupId>com.example.webservice</groupId>
12     <artifactId>demo</artifactId>
13     <version>0.0.1-SNAPSHOT</version>
14     <name>service</name>
15     <description>Demo project for Spring Boot</description>
16 
17     <properties>
18         <java.version>1.8</java.version>
19     </properties>
20 
21     <dependencies>
22         <dependency>
23             <groupId>org.springframework.boot</groupId>
24             <artifactId>spring-boot-starter-web</artifactId>
25         </dependency>
26         <dependency>
27             <groupId>org.springframework.boot</groupId>
28             <artifactId>spring-boot-starter-web-services</artifactId>
29         </dependency>
30 
31         <dependency>
32             <groupId>org.springframework.boot</groupId>
33             <artifactId>spring-boot-devtools</artifactId>
34             <scope>runtime</scope>
35             <optional>true</optional>
36         </dependency>
37         <dependency>
38             <groupId>org.springframework.boot</groupId>
39             <artifactId>spring-boot-configuration-processor</artifactId>
40             <optional>true</optional>
41         </dependency>
42         <dependency>
43             <groupId>org.projectlombok</groupId>
44             <artifactId>lombok</artifactId>
45             <optional>true</optional>
46         </dependency>
47         <dependency>
48             <groupId>org.springframework.boot</groupId>
49             <artifactId>spring-boot-starter-test</artifactId>
50             <scope>test</scope>
51             <exclusions>
52                 <exclusion>
53                     <groupId>org.junit.vintage</groupId>
54                     <artifactId>junit-vintage-engine</artifactId>
55                 </exclusion>
56             </exclusions>
57         </dependency>
58 
59         <!--json解析-->
60         <dependency>
61             <groupId>com.alibaba</groupId>
62             <artifactId>fastjson</artifactId>
63         </dependency>
64         <dependency>
65             <groupId>net.sf.json-lib</groupId>
66             <artifactId>json-lib</artifactId>
67             <version>2.4</version>
68             <classifier>jdk15</classifier>
69         </dependency>
70         <!--webservice依赖-->
71         <dependency>
72             <groupId>org.apache.cxf</groupId>
73             <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
74             <version>3.2.6</version>
75         </dependency>
76     </dependencies>
77 
78     <build>
79         <plugins>
80             <plugin>
81                 <groupId>org.springframework.boot</groupId>
82                 <artifactId>spring-boot-maven-plugin</artifactId>
83             </plugin>
84         </plugins>
85     </build>
86 
87 </project>

 

3、实体类代码如下:

 1 package com.example.webservice.demo.entity;
 2 
 3 import lombok.Data;
 4 
 5 /**
 6  * @author xzy
 7  * @date 2020-03-15 18:24
 8  * 说明:学生表对应的实体类
 9  */
10 @Data
11 public class StudentEntity {
12     private String name;
13     private Integer age;
14 
15     public StudentEntity(String name, Integer age) {
16         this.name = name;
17         this.age = age;
18     }
19 
20     public StudentEntity() {
21     }
22 }
 1 package com.example.webservice.demo.entity;
 2 
 3 import lombok.Data;
 4 
 5 /**
 6  * @author xzy
 7  * @date 2020-03-15 18:25
 8  * 说明:user表对应的实体类
 9  */
10 @Data
11 public class UserEntity {
12     private String name;
13     private String sex;
14 
15     public UserEntity(String name, String sex) {
16         this.name = name;
17         this.sex = sex;
18     }
19 
20     public UserEntity() {
21     }
22 }

3、webservice接口及其实现类代码:

 1 package com.example.webservice.demo.service;
 2 
 3 import com.example.webservice.demo.entity.StudentEntity;
 4 
 5 import javax.jws.WebMethod;
 6 import javax.jws.WebService;
 7 import java.util.List;
 8 
 9 /**
10  * @author xzy
11  * @date 2020-03-15 18:26
12  * 说明:
13  * targetNamespace - 命名空间,写一个有意义的http地址就可以,写成包名的倒序是为了易于阅读。
14  */
15 @WebService(targetNamespace = "http://service.demo.webservice.example.com")
16 public interface StudentService {
17     /**
18      * 获取所有学生信息
19      *
20      * @return - 所有学生信息
21      */
22     @WebMethod
23     List<StudentEntity> getAll();
24 }
 1 package com.example.webservice.demo.service;
 2 
 3 import com.example.webservice.demo.entity.UserEntity;
 4 
 5 import javax.jws.WebMethod;
 6 import javax.jws.WebParam;
 7 import javax.jws.WebService;
 8 import java.util.List;
 9 
10 /**
11  * @author xzy
12  * @date 2020-03-15 18:26
13  * 说明:对外提供的用户信息服务
14  */
15 @WebService(targetNamespace = "http://service.demo.webservice.example.com")
16 public interface UserService {
17     /**
18      * 获取所有用户信息
19      *
20      * @return - 所有用户信息
21      */
22     @WebMethod
23     List<UserEntity> getAllUser();
24 
25     /**
26      * 根据用户名获取用户信息
27      *
28      * @param username - 用户名
29      * @return - 用户信息
30      */
31     @WebMethod
32     UserEntity getUserByName(@WebParam(name = "username") String username);
33 }
 1 package com.example.webservice.demo.serviceimpl;
 2 
 3 import com.example.webservice.demo.entity.StudentEntity;
 4 import com.example.webservice.demo.service.StudentService;
 5 import org.springframework.stereotype.Service;
 6 
 7 import javax.jws.WebService;
 8 import java.util.ArrayList;
 9 import java.util.List;
10 
11 /**
12  * @author xzy
13  * @date 2020-03-15 20:01
14  * 说明:对外提供的学生信息服务
15  */
16 @WebService(serviceName = "StudentService",
17         targetNamespace = "http://service.demo.webservice.example.com",
18         endpointInterface = "com.example.webservice.demo.service.StudentService")
19 @Service
20 public class StudentServiceImpl implements StudentService {
21     /**
22      * 获取所有学生信息
23      *
24      * @return - 所有学生信息
25      */
26     @Override
27     public List<StudentEntity> getAll() {
28         System.out.println("getAll():监听到请求");
29         List<StudentEntity> students = new ArrayList<>();
30         StudentEntity student1 = new StudentEntity("zhangsan", 20);
31         StudentEntity student2 = new StudentEntity("lisi", 21);
32         students.add(student1);
33         students.add(student2);
34         return students;
35     }
36 }
 1 package com.example.webservice.demo.serviceimpl;
 2 
 3 import com.example.webservice.demo.entity.UserEntity;
 4 import com.example.webservice.demo.service.UserService;
 5 import org.springframework.stereotype.Service;
 6 
 7 import javax.jws.WebService;
 8 import java.util.ArrayList;
 9 import java.util.List;
10 
11 /**
12  * @author xzy
13  * @date 2020-03-15 20:02
14  * 说明:
15  */
16 @WebService(serviceName = "UserService",
17         targetNamespace = "http://service.demo.webservice.example.com",
18         endpointInterface = "com.example.webservice.demo.service.UserService")
19 @Service
20 public class UserServiceImpl implements UserService {
21     /**
22      * 获取所有用户信息
23      *
24      * @return - 所有用户信息
25      */
26     @Override
27     public List<UserEntity> getAllUser() {
28         System.out.println("getAllUser():监听到请求");
29         List<UserEntity> users = new ArrayList<>();
30         UserEntity user1 = new UserEntity("wangwu", "f");
31         UserEntity user2 = new UserEntity("xiaoyu", "m");
32         users.add(user1);
33         users.add(user2);
34         return users;
35     }
36 
37     /**
38      * 根据用户名获取用户信息
39      *
40      * @param username - 用户名
41      * @return - 用户信息
42      */
43     @Override
44     public UserEntity getUserByName(String username) {
45         System.out.println("getUserByName():监听到请求,参数username = " + username);
46         if ("张三".equals(username)) {
47             return new UserEntity("张三", "m");
48         } else {
49             return new UserEntity("helloWorld", "!");
50         }
51     }
52 }

3、发布WebService

 1 package com.example.webservice.demo.config;
 2 
 3 import com.example.webservice.demo.service.StudentService;
 4 import com.example.webservice.demo.service.UserService;
 5 import org.apache.cxf.Bus;
 6 import org.springframework.beans.factory.annotation.Autowired;
 7 import org.springframework.context.annotation.Bean;
 8 import org.springframework.context.annotation.Configuration;
 9 import org.apache.cxf.jaxws.EndpointImpl;
10 
11 import javax.xml.ws.Endpoint;
12 
13 /**
14  * @author xzy
15  * @date 2020-03-15 17:49
16  * 说明:服务端发布相关接口
17  */
18 @Configuration
19 public class WebConfig {
20     private Bus bus;
21     private StudentService studentService;
22     private UserService userService;
23 
24     @Autowired
25     private void dependenceInject(Bus bus, StudentService studentService, UserService userService) {
26         this.bus = bus;
27         this.studentService = studentService;
28         this.userService = userService;
29     }
30 
31     @Bean
32     public Endpoint endpointStudentService() {
33         EndpointImpl endpoint = new EndpointImpl(bus, studentService);
34         //接口发布在 /StudentService下
35         endpoint.publish("/StudentService");
36         return endpoint;
37     }
38 
39     @Bean
40     public Endpoint endpointUserService() {
41         EndpointImpl endpoint = new EndpointImpl(bus, userService);
42         endpoint.publish("/UserService");
43         return endpoint;
44     }
45 }

 4、启动服务端


5、查看webservice是否部署成功 


点击 {http://service.demo.webservice.example.com}StudentService,查看到以下内容:

 1 This XML file does not appear to have any style information associated with it. The document tree is shown below.
 2 <wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://service.demo.webservice.example.com" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="StudentService" targetNamespace="http://service.demo.webservice.example.com">
 3     <wsdl:types>
 4         <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://service.demo.webservice.example.com" elementFormDefault="unqualified" targetNamespace="http://service.demo.webservice.example.com" version="1.0">
 5             <xs:element name="getAll" type="tns:getAll"/>
 6             <xs:element name="getAllResponse" type="tns:getAllResponse"/>
 7             <xs:complexType name="getAll">
 8                 <xs:sequence/>
 9             </xs:complexType>
10             <xs:complexType name="getAllResponse">
11                 <xs:sequence>
12                     <xs:element maxOccurs="unbounded" minOccurs="0" name="return" type="tns:studentEntity"/>
13                 </xs:sequence>
14             </xs:complexType>
15             <xs:complexType name="studentEntity">
16                 <xs:sequence>
17                     <xs:element minOccurs="0" name="age" type="xs:int"/>
18                     <xs:element minOccurs="0" name="name" type="xs:string"/>
19                 </xs:sequence>
20             </xs:complexType>
21         </xs:schema>
22     </wsdl:types>
23     <wsdl:message name="getAllResponse">
24         <wsdl:part element="tns:getAllResponse" name="parameters"> </wsdl:part>
25     </wsdl:message>
26     <wsdl:message name="getAll">
27         <wsdl:part element="tns:getAll" name="parameters"> </wsdl:part>
28     </wsdl:message>
29     <wsdl:portType name="StudentService">
30         <wsdl:operation name="getAll">
31             <wsdl:input message="tns:getAll" name="getAll"> </wsdl:input>
32             <wsdl:output message="tns:getAllResponse" name="getAllResponse"> </wsdl:output>
33         </wsdl:operation>
34     </wsdl:portType>
35     <wsdl:binding name="StudentServiceSoapBinding" type="tns:StudentService">
36         <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
37         <wsdl:operation name="getAll">
38             <soap:operation soapAction="" style="document"/>
39             <wsdl:input name="getAll">
40                 <soap:body use="literal"/>
41             </wsdl:input>
42             <wsdl:output name="getAllResponse">
43                 <soap:body use="literal"/>
44             </wsdl:output>
45         </wsdl:operation>
46     </wsdl:binding>
47     <wsdl:service name="StudentService">
48         <wsdl:port binding="tns:StudentServiceSoapBinding" name="StudentServiceImplPort">
49             <soap:address location="http://127.0.0.1:1234/services/StudentService"/>
50         </wsdl:port>
51     </wsdl:service>
52 </wsdl:definitions>

客户端

1、创建工程client,完整工程为:


2、 添加依赖包,pom.xml文件与服务端相同。

3、实现客户端调用webservice服务:

 1 package com.example.webservice.demo.serviceimpl;
 2 
 3 import net.sf.json.JSONArray;
 4 import org.apache.cxf.endpoint.Client;
 5 import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
 6 
 7 import java.util.Arrays;
 8 
 9 
10 /**
11  * @author xzy
12  * @date 2020-03-15 21:04
13  * 说明:测试
14  */
15 public class Test {
16     public static void main(String[] args) {
17         //在一个方法中连续调用多次WebService接口,每次调用前需要重置上下文。
18         ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
19         /*
20          * --通过JaxWsDynamicClientFactory进行WebService客户端调用的一个好处就是,只需要知道了WSDL地址就行了,
21          * 不需要手动生成任何代码,这样,如果需要调用多个WebService服务的话,只需要创建多个Client即可,不用
22          * 考虑传统方式(生成代码)冲突问题,这样可以让代码更优雅。
23          */
24         JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
25 
26         printStudents(dcf);
27 
28         //在调用第二个webservice前,需要重置上下文
29         Thread.currentThread().setContextClassLoader(classLoader);
30 
31         printUser(dcf);
32     }
33 
34     /**
35      * 调用远端WebService的服务,获取学生信息
36      *
37      * @param dcf - 用于远程webservice调用。
38      */
39     private static void printStudents(JaxWsDynamicClientFactory dcf) {
40         Client client = dcf.createClient("http://127.0.0.1:1234/services/StudentService?wsdl");
41 
42         /*
43          *--需要密码的情况需要添加上用户名和密码
44          *client.getOutInterceptors().add(new ClientLoginInterceptor(USERNAME,PASSWORD));
45          */
46 
47         try {
48             //invoke("方法名",参数1,参数2,参数3......)
49             Object students = client.invoke("getAll");
50             JSONArray jsonArray = JSONArray.fromObject(students);
51             System.out.println(Arrays.toString(jsonArray.toArray()));
52         } catch (Exception e) {
53             e.printStackTrace();
54         }
55 
56     }
57 
58     /**
59      * 调用远端WebService的服务,获取用户信息
60      *
61      * @param dcf - 用于远程webservice调用。
62      */
63     private static void printUser(JaxWsDynamicClientFactory dcf) {
64         Client client = dcf.createClient("http://127.0.0.1:1234/services/UserService?wsdl");
65 
66         /*
67          *--需要密码的情况需要添加上用户名和密码
68          *client.getOutInterceptors().add(new ClientLoginInterceptor(USERNAME,PASSWORD));
69          */
70         try {
71             /*
72              *--invoke("方法名",参数1,参数2,参数3......),返回值Object[]
73              *--invoke将请求拼接成xml发送给远端的WebService服务,接受对面返回的xml,取出返回值,填到一个Java对象返回。
74              */
75             Object user = client.invoke("getUserByName", "张三");
76             JSONArray jsonArray = JSONArray.fromObject(user);
77             System.out.println(Arrays.toString(jsonArray.toArray()));
78         } catch (
79                 Exception e) {
80             e.printStackTrace();
81         }
82 
83     }
84 }

4、执行代码

客户端打印:

[[{"age":20,"name":"zhangsan"},{"age":21,"name":"lisi"}]]

服务端打印:

getAll():监听到请求
getUserByName():监听到请求,参数username = 张三