zoukankan      html  css  js  c++  java
  • springboot+cfx实现webservice功能

    一、开发服务端

    1、新建工程 cfx-webservice ,最终的完整工程如下:

    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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.cfx.simple.service</groupId>
        <artifactId>cfx-webservice</artifactId>
        <version>1.0-SNAPSHOT</version>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.4.1.RELEASE</version>
        </parent>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
                <version>3.1.12</version>
            </dependency>
        </dependencies>
    
    </project>

    红色部分的依赖是开发webservice的依赖包,其他的只是springboot需要的基本包

    1、实体类(Student和User)

    public class Student {
        private String stuName;
        private Integer stuAge;
    
        public Student(String stuName, Integer stuAge) {
            this.stuName = stuName;
            this.stuAge = stuAge;
        }
    
        public String getStuName() {
            return stuName;
        }
    
        public void setStuName(String stuName) {
            this.stuName = stuName;
        }
    
        public Integer getStuAge() {
            return stuAge;
        }
    
        public void setStuAge(Integer stuAge) {
            this.stuAge = stuAge;
        }
    }
    public class User {
        private String name;
        private String sex;
    
        public User(String name, String sex) {
            this.name = name;
            this.sex = sex;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
    }

    2、WebService的接口和实现类(一个是返回用户信息的WebService,一个是返回学生信息的WebService)

    1)学生的

    package com.cfx.simple.service;
    
    import com.cfx.simple.model.Student;
    import javax.jws.WebMethod;
    import javax.jws.WebService;
    import java.util.List;
    
    /**
     * @author Administrator
     * @date 2019/01/30
     */
    @WebService(targetNamespace = "http://service.simple.cfx.com")//  命名空间,写一个有意义的http地址就行,并不是网上所说的要写成包名倒序,只不过写成包名倒序易读而已
    public interface StudentService {
    
        @WebMethod
        List<Student> getStudentList();
    }
    package com.cfx.simple.service;
    
    import com.cfx.simple.model.Student;
    import org.springframework.stereotype.Component;
    import javax.jws.WebService;
    import java.util.Arrays;
    import java.util.List;
    
    /**
     * @author Administrator
     * @date 2019/01/30
     */
    @WebService(serviceName = "StudentService",
            targetNamespace = "http://service.simple.cfx.com",
            endpointInterface = "com.cfx.simple.service.StudentService")
    @Component
    public class StudentServiceImpl implements StudentService {
        @Override
        public List<Student> getStudentList() {
            Student stu1 = new Student("学生1",25);
            Student stu2 = new Student("学生2",30);
            return Arrays.asList(stu1,stu2);
        }
    }

    2)用户的

    package com.cfx.simple.service;
    
    import com.cfx.simple.model.User;
    import javax.jws.WebMethod;
    import javax.jws.WebParam;
    import javax.jws.WebService;
    import java.util.List;
    
    /**
     * @author Administrator
     * @date 2019/01/30
     */
    @WebService(targetNamespace = "http://service.simple.cfx.com")// 命名空间,写一个有意义的http地址就行,并不是网上所说的要写成包名倒序,只不过写成包名倒序易读而已
    public interface UserService {
    
        @WebMethod
        List<User> getUserList(@WebParam(name = "userName") String userName);
    }
    package com.cfx.simple.service;
    
    import com.cfx.simple.model.User;
    import org.springframework.stereotype.Component;
    import javax.jws.WebService;
    import java.util.Arrays;
    import java.util.List;
    
    /**
     * @author Administrator
     * @date 2019/01/30
     */
    @WebService(serviceName = "UserService",
            targetNamespace = "http://service.simple.cfx.com",
            endpointInterface = "com.cfx.simple.service.UserService")
    @Component
    public class UserServiceImpl implements UserService {
        @Override
        public List<User> getUserList(String userName) {
            System.out.println("输入参数:" + userName);
            User user1 = new User("张三", "男");
            User user2 = new User("李四", "男");
            return Arrays.asList(user1,user2);
        }
    }

    3、发布WebService的配置类

    package com.cfx.simple.config;
    
    import com.cfx.simple.service.StudentService;
    import com.cfx.simple.service.UserService;
    import org.apache.cxf.Bus;
    import org.apache.cxf.jaxws.EndpointImpl;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import javax.xml.ws.Endpoint;
    
    /**
     * @author Administrator
     * @date 2019/01/30
     */
    @Configuration
    public class WebServiceConfig {
    
        @Autowired
        private Bus bus;
        @Autowired
        private UserService userService;
        @Autowired
        private StudentService studentService;
    
        @Bean
        public Endpoint endpointUserService() {
            EndpointImpl endpoint = new EndpointImpl(bus,userService);
            endpoint.publish("/UserService");//接口发布在 /UserService 目录下
            return endpoint;
        }
    
        @Bean
        public Endpoint endpointStudentService() {
            EndpointImpl endpoint = new EndpointImpl(bus,studentService);
            endpoint.publish("/StudentService");//接口发布在 /StudentService 目录下
            return endpoint;
        }
    }

    4、springboot启动类

    package com.cfx.simple;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    /**
     * @author Administrator
     * @date 2019/01/30
     */
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) throws Exception {
            SpringApplication.run(Application.class, args);
        }
    }

    5、application.yml

    server:
      port: 8084
      context-path: /

    启动程序,浏览器输入:http://localhost:8084/services 

    点击WSDL

    二、开发客户端进行测试

     1、新建cfx-webservice-client

     

    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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>cfx.webservice.client</groupId>
        <artifactId>cfx-webservice-client</artifactId>
        <version>1.0-SNAPSHOT</version>
        <dependencies>
            <!--调用webserivce的依赖-->
            <dependency>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
                <version>3.1.12</version>
            </dependency>
            <!--用于将对象转换成json-->
            <dependency>
                <groupId>net.sf.json-lib</groupId>
                <artifactId>json-lib</artifactId>
                <version>2.4</version>
                <classifier>jdk15</classifier>
            </dependency>
        </dependencies>
    </project>

    2、编写测试类

    import net.sf.json.JSONObject;
    import org.apache.cxf.endpoint.Client;
    import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
    
    import java.util.ArrayList;
    
    /**
     * @author Administrator
     * @date 2019/01/30
     */
    public class Test {
        public static void main(String[] args){
            //在一个方法中连续调用多次WebService接口,每次调用前需要重置上下文
            ClassLoader cl = Thread.currentThread().getContextClassLoader();
    
            JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
            System.out.println("学生的信息如下:================");
            printStudentList(dcf);
            //在调用第二个webservice前,需要重置上下文
            Thread.currentThread().setContextClassLoader(cl);
    
            System.out.println("用户的信息如下:================");
            printUserList(dcf);
        }
    
        private static void printUserList(JaxWsDynamicClientFactory dcf){
            Client client = dcf.createClient("http://localhost:8084/services/UserService?wsdl");
            // 需要密码的情况需要加上用户名和密码
            // client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME, PASS_WORD));
            Object[] objects = new Object[0];
            try {
                // invoke("方法名",参数1,参数2,参数3....);
                objects = client.invoke("getUserList", "张三");
                if(objects.length>0){
                    ArrayList<Object> objectList = (ArrayList)objects[0];
                    for (Object o:objectList){
                        JSONObject jsonObject = JSONObject.fromObject(o);
                        System.out.println("userName:"+jsonObject.getString("name")+",sex:"+jsonObject.getString("sex"));
                    }
                }
            } catch (java.lang.Exception e) {
                e.printStackTrace();
            }
        }
    
        private static void printStudentList(JaxWsDynamicClientFactory dcf){
    
            Client client = dcf.createClient("http://localhost:8084/services/StudentService?wsdl");
            // 需要密码的情况需要加上用户名和密码
            // client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME, PASS_WORD));
            Object[] objects = new Object[0];
            try {
                // invoke("方法名",参数1,参数2,参数3....);
                objects = client.invoke("getStudentList","");
                if(objects.length>0){
                    ArrayList<Object> objectList = (ArrayList)objects[0];
                    for (Object o:objectList){
                        JSONObject jsonObject = JSONObject.fromObject(o);
                        System.out.println("stuName:"+jsonObject.getString("stuName")+",stuAge:"+jsonObject.getString("stuAge"));
                    }
                }
            } catch (java.lang.Exception e) {
                e.printStackTrace();
            }
        }
    }
    学生的信息如下:================
    stuName:学生1,stuAge:25
    stuName:学生2,stuAge:30
    用户的信息如下:================
    userName:张三,sex:男
    userName:李四,sex:男

    上面的红色代码不能去掉,去掉后,第一个webservice调用正常,第二个会报以下错误:

  • 相关阅读:
    Zabbix 配置笔记
    Centos7安装MySQL5.7和Redis6.0流水账
    Elasticsearch, Kibana安装
    服务治理 Service Mesh & Kubernetes & Spring Cloud的异同 侵入式 非侵入式
    文思海辉 华为 银行 ODS (oCRM)
    Java Profiler JavaMemoryLeak Arthas
    动物:人类、熊类、马类 团队精神 与 鼓励
    BPMN Sketch Miner https://design.inf.usi.ch/bpmn-sketch-miner/#
    Architecture, Design and Web Information Systems Engineering
    Cloud design patterns
  • 原文地址:https://www.cnblogs.com/boshen-hzb/p/10338989.html
Copyright © 2011-2022 走看看