WebService远程服务端
1、新建工程service,最终工程如下:
2、添加依赖包,pom.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.webservice</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>service</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--json解析-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<!--webservice依赖-->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.2.6</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3、实体类代码如下:
package com.example.webservice.demo.entity;
import lombok.Data;
/**
* @author xzy
* @date 2020-03-15 18:24
* 说明:学生表对应的实体类
*/
@Data
public class StudentEntity {
private String name;
private Integer age;
public StudentEntity(String name, Integer age) {
this.name = name;
this.age = age;
}
public StudentEntity() {
}
}
package com.example.webservice.demo.entity;
import lombok.Data;
/**
* @author xzy
* @date 2020-03-15 18:25
* 说明:user表对应的实体类
*/
@Data
public class UserEntity {
private String name;
private String sex;
public UserEntity(String name, String sex) {
this.name = name;
this.sex = sex;
}
public UserEntity() {
}
}
3、webservice接口及其实现类代码:
package com.example.webservice.demo.service;
import com.example.webservice.demo.entity.StudentEntity;
import javax.jws.WebMethod;
import javax.jws.WebService;
import java.util.List;
/**
* @author xzy
* @date 2020-03-15 18:26
* 说明:
* targetNamespace - 命名空间,写一个有意义的http地址就可以,写成包名的倒序是为了易于阅读。
*/
@WebService(targetNamespace = "http://service.demo.webservice.example.com")
public interface StudentService {
/**
* 获取所有学生信息
*
* @return - 所有学生信息
*/
@WebMethod
List<StudentEntity> getAll();
}
package com.example.webservice.demo.service;
import com.example.webservice.demo.entity.UserEntity;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import java.util.List;
/**
* @author xzy
* @date 2020-03-15 18:26
* 说明:对外提供的用户信息服务
*/
@WebService(targetNamespace = "http://service.demo.webservice.example.com")
public interface UserService {
/**
* 获取所有用户信息
*
* @return - 所有用户信息
*/
@WebMethod
List<UserEntity> getAllUser();
/**
* 根据用户名获取用户信息
*
* @param username - 用户名
* @return - 用户信息
*/
@WebMethod
UserEntity getUserByName(@WebParam(name = "username") String username);
}
package com.example.webservice.demo.serviceimpl;
import com.example.webservice.demo.entity.StudentEntity;
import com.example.webservice.demo.service.StudentService;
import org.springframework.stereotype.Service;
import javax.jws.WebService;
import java.util.ArrayList;
import java.util.List;
/**
* @author xzy
* @date 2020-03-15 20:01
* 说明:对外提供的学生信息服务
*/
@WebService(serviceName = "StudentService",
targetNamespace = "http://service.demo.webservice.example.com",
endpointInterface = "com.example.webservice.demo.service.StudentService")
@Service
public class StudentServiceImpl implements StudentService {
/**
* 获取所有学生信息
*
* @return - 所有学生信息
*/
@Override
public List<StudentEntity> getAll() {
System.out.println("getAll():监听到请求");
List<StudentEntity> students = new ArrayList<>();
StudentEntity student1 = new StudentEntity("zhangsan", 20);
StudentEntity student2 = new StudentEntity("lisi", 21);
students.add(student1);
students.add(student2);
return students;
}
}
package com.example.webservice.demo.serviceimpl;
import com.example.webservice.demo.entity.UserEntity;
import com.example.webservice.demo.service.UserService;
import org.springframework.stereotype.Service;
import javax.jws.WebService;
import java.util.ArrayList;
import java.util.List;
/**
* @author xzy
* @date 2020-03-15 20:02
* 说明:
*/
@WebService(serviceName = "UserService",
targetNamespace = "http://service.demo.webservice.example.com",
endpointInterface = "com.example.webservice.demo.service.UserService")
@Service
public class UserServiceImpl implements UserService {
/**
* 获取所有用户信息
*
* @return - 所有用户信息
*/
@Override
public List<UserEntity> getAllUser() {
System.out.println("getAllUser():监听到请求");
List<UserEntity> users = new ArrayList<>();
UserEntity user1 = new UserEntity("wangwu", "f");
UserEntity user2 = new UserEntity("xiaoyu", "m");
users.add(user1);
users.add(user2);
return users;
}
/**
* 根据用户名获取用户信息
*
* @param username - 用户名
* @return - 用户信息
*/
@Override
public UserEntity getUserByName(String username) {
System.out.println("getUserByName():监听到请求,参数username = " + username);
if ("张三".equals(username)) {
return new UserEntity("张三", "m");
} else {
return new UserEntity("helloWorld", "!");
}
}
}
3、发布WebService
package com.example.webservice.demo.config;
import com.example.webservice.demo.service.StudentService;
import com.example.webservice.demo.service.UserService;
import org.apache.cxf.Bus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.apache.cxf.jaxws.EndpointImpl;
import javax.xml.ws.Endpoint;
/**
* @author xzy
* @date 2020-03-15 17:49
* 说明:服务端发布相关接口
*/
@Configuration
public class WebConfig {
private Bus bus;
private StudentService studentService;
private UserService userService;
@Autowired
private void dependenceInject(Bus bus, StudentService studentService, UserService userService) {
this.bus = bus;
this.studentService = studentService;
this.userService = userService;
}
@Bean
public Endpoint endpointStudentService() {
EndpointImpl endpoint = new EndpointImpl(bus, studentService);
//接口发布在 /StudentService下
endpoint.publish("/StudentService");
return endpoint;
}
@Bean
public Endpoint endpointUserService() {
EndpointImpl endpoint = new EndpointImpl(bus, userService);
endpoint.publish("/UserService");
return endpoint;
}
}
4、启动服务端
5、查看webservice是否部署成功
点击 {http://service.demo.webservice.example.com}StudentService,查看到以下内容:
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<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">
<wsdl:types>
<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">
<xs:element name="getAll" type="tns:getAll"/>
<xs:element name="getAllResponse" type="tns:getAllResponse"/>
<xs:complexType name="getAll">
<xs:sequence/>
</xs:complexType>
<xs:complexType name="getAllResponse">
<xs:sequence>
<xs:element maxOccurs="unbounded" minOccurs="0" name="return" type="tns:studentEntity"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="studentEntity">
<xs:sequence>
<xs:element minOccurs="0" name="age" type="xs:int"/>
<xs:element minOccurs="0" name="name" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
<wsdl:message name="getAllResponse">
<wsdl:part element="tns:getAllResponse" name="parameters"> </wsdl:part>
</wsdl:message>
<wsdl:message name="getAll">
<wsdl:part element="tns:getAll" name="parameters"> </wsdl:part>
</wsdl:message>
<wsdl:portType name="StudentService">
<wsdl:operation name="getAll">
<wsdl:input message="tns:getAll" name="getAll"> </wsdl:input>
<wsdl:output message="tns:getAllResponse" name="getAllResponse"> </wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="StudentServiceSoapBinding" type="tns:StudentService">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="getAll">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="getAll">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="getAllResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="StudentService">
<wsdl:port binding="tns:StudentServiceSoapBinding" name="StudentServiceImplPort">
<soap:address location="http://127.0.0.1:1234/services/StudentService"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
客户端
1、创建工程client,完整工程为:
2、 添加依赖包,pom.xml文件与服务端相同。
3、实现客户端调用webservice服务:
package com.example.webservice.demo.serviceimpl;
import net.sf.json.JSONArray;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import java.util.Arrays;
/**
* @author xzy
* @date 2020-03-15 21:04
* 说明:测试
*/
public class Test {
public static void main(String[] args) {
//在一个方法中连续调用多次WebService接口,每次调用前需要重置上下文。
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
/*
* --通过JaxWsDynamicClientFactory进行WebService客户端调用的一个好处就是,只需要知道了WSDL地址就行了,
* 不需要手动生成任何代码,这样,如果需要调用多个WebService服务的话,只需要创建多个Client即可,不用
* 考虑传统方式(生成代码)冲突问题,这样可以让代码更优雅。
*/
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
printStudents(dcf);
//在调用第二个webservice前,需要重置上下文
Thread.currentThread().setContextClassLoader(classLoader);
printUser(dcf);
}
/**
* 调用远端WebService的服务,获取学生信息
*
* @param dcf - 用于远程webservice调用。
*/
private static void printStudents(JaxWsDynamicClientFactory dcf) {
Client client = dcf.createClient("http://127.0.0.1:1234/services/StudentService?wsdl");
/*
*--需要密码的情况需要添加上用户名和密码
*client.getOutInterceptors().add(new ClientLoginInterceptor(USERNAME,PASSWORD));
*/
try {
//invoke("方法名",参数1,参数2,参数3......)
Object students = client.invoke("getAll");
JSONArray jsonArray = JSONArray.fromObject(students);
System.out.println(Arrays.toString(jsonArray.toArray()));
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 调用远端WebService的服务,获取用户信息
*
* @param dcf - 用于远程webservice调用。
*/
private static void printUser(JaxWsDynamicClientFactory dcf) {
Client client = dcf.createClient("http://127.0.0.1:1234/services/UserService?wsdl");
/*
*--需要密码的情况需要添加上用户名和密码
*client.getOutInterceptors().add(new ClientLoginInterceptor(USERNAME,PASSWORD));
*/
try {
/*
*--invoke("方法名",参数1,参数2,参数3......),返回值Object[]
*--invoke将请求拼接成xml发送给远端的WebService服务,接受对面返回的xml,取出返回值,填到一个Java对象返回。
*/
Object user = client.invoke("getUserByName", "张三");
JSONArray jsonArray = JSONArray.fromObject(user);
System.out.println(Arrays.toString(jsonArray.toArray()));
} catch (
Exception e) {
e.printStackTrace();
}
}
}
4、执行代码
客户端打印:
[[{"age":20,"name":"zhangsan"},{"age":21,"name":"lisi"}]]
服务端打印:
getAll():监听到请求
getUserByName():监听到请求,参数username = 张三