SpringBoot 整合 WebService

22 篇文章 0 订阅

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 = 张三

代码获取:https://github.com/xiaozhengyu/SpringBoot.git

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值