• SpringBoot集成webservice


    前言

    之前在工作中,有时候需要去对接第三方的医院,而很多医院的his系统用的都是老技术(WebService)。一直在对接webservice接口,却不知道webservice接口是怎么实现的,这一次,我们来一探究竟。

    这里吐槽一句,都什么年代了?还在用webservice?

    WebService依赖什么?

    跨语言和操作系统的远程调用技术。比如亚马逊,可以将自己的服务以webservice的服务形式暴露出来,我们就可以通过web调用这些,无论我们使用的语言是java还是c,这也是SOA应用一种表现形式。

    WSDL(Web Service Description Language)将无论用何种语言书写的web service描述出来,比如其参数或返回值。WSDL是服务端和客户端都能解读的标准格式。客户端通过URL地址访问到WSDL文件,在调用服务端之前先访问WSDL文件。读取到WSDL后通过客户端的API类可以生成代理类,调用这些代理类就可以访问webservice服务。代理类将客户端的方法变为soap(Simple Object Access Protocal,可以理解为http+xml)格式通过http发送,同时接受soap格式的返回值并解析。

    依赖

    <dependency>
      <groupId>org.springframework.bootgroupId>
       <artifactId>spring-boot-starter-webartifactId>
    dependency>
    <dependency>
       <groupId>org.apache.cxfgroupId>
       <artifactId>cxf-spring-boot-starter-jaxwsartifactId>
       <version>3.3.4version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    创建实体类

    /**
     * @author Fang Ruichuan
     * @date 2022-11-14 19:02
     */
    @Data
    @Builder
    public class UserDto {
        private Long id;
        private String name;
        private Integer age;
        private String address;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    创建WebService接口

    /**
     * @author Fang Ruichuan
     * @date 2022-11-14 19:03
     */
    public interface IUserServer {
        default UserDto getUser(Long str) {
            throw new RuntimeException("程序员正在马不停蹄地开发新功能");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    创建WebService接口的实现类

    /**
     * @author Fang Ruichuan
     * @date 2022-11-14 19:08
     */
    @Service
    @WebService
    public class UserServerImpl implements IUserServer {
    
        @Override
        public UserDto getUser(Long id) {
            return UserDto.builder()
                    .id(id)
                    .address("上海市浦东新区")
                    .age(25)
                    .name("laJi").build();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    这里用到了注解@WebService,我这就只在实现类上使用了。这里介绍一下,先来看下它的定义:

    @Retention(RetentionPolicy.RUNTIME)
    @Target({ElementType.TYPE})
    public @interface WebService {
        String name() default "";
    
        String targetNamespace() default "";
    
        String serviceName() default "";
    
        String portName() default "";
    
        String wsdlLocation() default "";
    
        String endpointInterface() default "";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • name: 对应wsdl:portType标签,默认值为Java类或接口的名称;
    • targetNamespace: 命名空间,一般写为接口的包名倒序,默认值也是接口的包名倒序。对应wsd:definitions:targetNamespace 标签;
    • serviceName: WebService的服务名称,对应wsdl:service,默认值为WebService接口实现类的名称+“Service”,示例:UserServiceImplServicce
    • portName: 对应wsdl:port标签,默认值为:WebService接口实现类的名称+“Port”,示例:UserServiceImplPort
    • wsdlLocation: 指定用于定义WebService的WSDL文档的地址
    • endpoointInterfacce: WebService接口全路径

    创建WebService配置类

    @Configuration
    @RequiredArgsConstructor
    public class CxfConfig {
        private final IUserServer userServer;
    
        /**
         * 注入Servlet,注意beanName不能为dispatcherServlet
         * @author Fang Ruichuan
         * @date 2022/11/14 19:16
         */
        @Bean
        public ServletRegistrationBean cxfServlet() {
            return new ServletRegistrationBean(new CXFServlet(), "/webservice/*");
        }
    
        @Bean(name = Bus.DEFAULT_BUS_ID)
        public SpringBus springBus() {
            return new SpringBus();
        }
    
        @Bean
        public Endpoint endpoint() {
            EndpointImpl endpoint = new EndpointImpl(springBus(), userServer);
            endpoint.publish("/api");
            return endpoint;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    启动服务:
    在这里插入图片描述
    进行访问:http://localhost:8080/webservice
    在这里插入图片描述
    然后点击url
    在这里插入图片描述

    客户端

    public class WebserviceClient {
        public static void main(String[] args) {
            JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
            Client client = dcf.createClient("http://localhost:8080/webservice/api?wsdl");
            final ObjectMapper mapper = new ObjectMapper();
            try {
                Object[] objects = client.invoke("getUser", 99L);
                System.out.println(mapper.writeValueAsString(objects[0]));
            } catch (Exception e) {
                e.printStackTrace();;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    显示:

    {"address":"上海市浦东新区","age":25,"id":99,"name":"laJi"}
    
    • 1
  • 相关阅读:
    前端学习笔记——js入门(一)
    Matlab之机载雷达系统中的空时自适应处理(STAP)技术(附源码)
    财报解读:双轮驱动下,香飘飘究竟能打开多大的获利空间?
    天锐绿盾企业内网安全管理软件
    感性认识一下Linux的进程地址空间和写时拷贝技术
    Mybatis系列之核心分析
    时间、空间复杂度的例题详解
    第六十三天 p1192
    吴恩达作业ex5:Regularized Linear Regression and Bias v.s. Variance
    k8s管理工具kubectl详解(二)
  • 原文地址:https://blog.csdn.net/qq_42582773/article/details/127917067