若依分离版——IDEA开发SpringBoot的webservice接口

news2024/10/6 16:23:21

一.webservice介绍

        WebService是帮助多个应用程序与平台和编程语言之间以独立的方式互相通信的标准化技术。它是利用标准 XML messaging(主要 SOAP) 技术,可以访问网络上的其他计算机的记述多种操作的软件接口。此接口主要由 WSDL (WebService Description Language)记述,可以处理多种多样的系统运作。

webservice优点

1)HTTP只能传输字符串类型,需要我们自己解析,而WebService支持复杂的数据类型。

2)传统客户端调用服务器的方法的过程是,发送,接收,解析消息,触发方法,而WebService类似于RPC,不需要我们关心如何发送接收和解析数据,能够像调用本地方法那样调用远程方法。

webservice的缺点

1)不适合相互调用,仅能让客户端调用服务端API,类似于单工通信。

2)相当于HTTP + XML解析,所以会比HTTP还慢,不适合需要高效通信的场景。

3)WebService会降低程序的性能,一台机器或一个局域网里面运行的同构应用程序就不应该用WebService进行通信。

webservice的适用/不适用场景

1)跨防火墙通信

2)应用程序集成:将不同语言写成的在不同平台上运行的各种程序集成起来。

3)软件重用

4)对内的接口不要使用webservice

二. IDEA开发SpringBoot开发webservice接口

本例使用若依通知公告示例

1.引入依赖

在ruoyi-system的pom.xml 引入依赖

        <!--webservice start-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web-services</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
            <version>3.4.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http-jetty</artifactId>
            <version>3.4.3</version>
        </dependency>
        <!--webservice end-->

2. 创建服务端接口

创建服务端接口及接口发布文件

 (1)NoticeWebService.java 接口

package com.ruoyi.webservice;
import com.ruoyi.system.domain.SysNotice;
import javax.jws.WebMethod;
import javax.jws.WebService;
import java.util.List;

@WebService(
        name = "NoticeWebService", // 暴露服务名称
        targetNamespace = "http://service.webservice.com"// 命名空间,一般是接口的包名倒序
)
public interface NoticeWebService {

    @WebMethod
    List<SysNotice> getList(SysNotice notice);
}

(2)NoticeWebServiceImpl.java 接口

package com.ruoyi.webservice.impl;

import com.ruoyi.system.domain.SysNotice;
import com.ruoyi.system.service.ISysNoticeService;
import com.ruoyi.webservice.NoticeWebService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.jws.WebService;
import java.util.List;

@Service
@WebService(serviceName = "NoticeWebService", // 与接口中指定的name一致, 都可以不写
        targetNamespace = "http://service.webservice.com", // 与接口中的命名空间一致,一般是接口的包名倒,都可以不用写
        endpointInterface = "com.ruoyi.webservice.NoticeWebService" // 接口类全路径
)
public class NoticeWebServiceImpl implements NoticeWebService {

    @Autowired
    private ISysNoticeService noticeService;

    @Override
    public List<SysNotice> getList(SysNotice notice) {
        System.out.println("服务被调用 参数:" + notice.getNoticeId());
        SysNotice notice1=new SysNotice();
        notice1.setNoticeId(Long.valueOf(1));
        return noticeService.selectNoticeList(notice1);
    }

}

(3)WebServiceConfiguration.java 发布接口

package com.ruoyi.webservice;

import org.apache.cxf.bus.spring.SpringBus;
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;

@Configuration
public class WebServiceConfiguration {



    @Autowired
    private NoticeWebService noticeWebService;

    @Autowired
    private SpringBus spirngBus;


    /**
     * 发布服务
     * @return
     */
    @Bean
    public Endpoint noticeWebServiceEndpoint(){

        System.out.println("服务发布");
        //这里指定的端口不能跟应用的端口冲突, 单独指定
        String path = "http://127.0.0.1:9090/ws/notice";

        EndpointImpl endpoint  = new EndpointImpl(spirngBus, noticeWebService);
        endpoint.publish(path);

        System.out.println("服务成功,path: " + path);
        System.out.println(String.format("在线的wsdl:%s?wsdl", path));

        return endpoint ;
    }
}

(4) 运行后

在浏览器访问接口链接: http://127.0.0.1:9090/ws/notice?wsdl

 如上所示,被调用的接口开发完成。

3. 创建客户端

本文使用的客户端是IDEA2021

(1)在ruoyi-admin下创建webservice目录—>noticeWebService目录,然后打开noticeWebSevice目录,点击菜单栏tools—》WebSevices——》Generate Java Code from Wsdl

输入WSDL地址,输出目录地址,选择Glassfish/jax-ws 2.2RI/Metro 1.x/JWSDP2.2

单击ok后,在目录下自动生成以下文件,主要使用的是NoticeWebService文件和NoticeWebService_Service文件

4. 调用验证

(1)引入单元测试依赖


        <!-- 单元测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.jupiter</groupId>
                    <artifactId>junit-jupiter-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
        </dependency>
        <!-- 单元测试结束-->

(2) 创建MyTest文件

 创建MyTest类,给接口传入SysNotice参数,通过NoticeWebService调用接口

package com.ruoyi.web;


import com.ruoyi.web.webservice.noticeWebService.NoticeWebService;
import com.ruoyi.web.webservice.noticeWebService.NoticeWebService_Service;
import com.ruoyi.RuoYiApplication;
import com.ruoyi.web.webservice.noticeWebService.SysNotice;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;


import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = RuoYiApplication.class)
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
public class MyTest {


    @Test
    public void test()
    {
        System.out.println("--------调用webservice接口begin-------");

        NoticeWebService_Service noticeWebService = new NoticeWebService_Service();
        SysNotice notice1=new SysNotice();
        notice1.setNoticeId(Long.valueOf(1));
        NoticeWebService webService = noticeWebService.getNoticeWebServiceImplPort();
        List<SysNotice> list = webService.getList(notice1);
        for(int i=0;i<list.size();i++)
        System.out.println(list.get(i).getNoticeId()+"===="+list.get(i).getNoticeTitle());
        System.out.println("--------调用webservice接口end-------");

    }
}

 (3)选择MyTest,右键run 运行结果如下,说明调用成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/548421.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WPF 未能加载文件或程序集 System.Windows.Interactivity

先说一下原因&#xff0c;这是因为微软抛弃了Interactivity导致。 NuGet下载Behaviors.Wpf 在xaml界面替换掉有Interactivity那一行&#xff0c;替换为: xmlns:i“http://schemas.microsoft.com/xaml/behaviors”

OA管理痛点解决:从“硬编码”到“低代码”

低代码开发平台是一种逐渐流行起来的软件开发方式&#xff0c;它可以以快速且简单的方式构建各种应用程序&#xff0c;从而帮助企业快速响应市场变化和满足不断变化的业务需求。在企业的日常管理工作中&#xff0c;OA系统是一种非常常见的应用程序&#xff0c;它可以帮助企业管…

外包五年,你知道这五年我怎么过的吗?

”五年&#xff0c;你知道我这五年怎么过的吗&#xff1f;“ 5年时间&#xff0c;我一路从外包到字节&#xff0c;说一句很俗的话&#xff0c; 现在的我真的要好好谢谢当初拼命努力的自己&#xff0c;要感谢跳出舒适圈的自己&#xff0c; 外包薪资真的不少&#xff0c;当初毕…

10几个类ChatGPT国内AI大模型【内附体验网址】

文章目录 前言1. AI文本工具站效率工具自媒体创作工具代码工具 2.道和顺ChatIC3.星期五4.文心一言5.讯飞星火认知大模型6.通义千问7.商汤-日日新8.Moss9.ChatGLM10. 360智脑写在最后 前言 随着ChatGPT迅速走红,国内各大企业纷纷发力认知大模型领域。经过一段时间的酝酿&#x…

微前端子应用间通信和数据共享

前面讲到了微前端的应用:(94条消息) 微前端应用(qiankunumiantd)_他夏了夏天吖的博客-CSDN博客https://blog.csdn.net/zh0623/article/details/130615234?spm1001.2014.3001.5501今天讲一下不同子应用的通信和数据共享问题 微前端不同子应用之间可能需要进行通信和数据共享,假…

深度学习中,batch大小对模型的效果有影响吗?

内容来自李宏毅-2021机器学习 ##先说结论&#xff1a;同一个模型&#xff0c;大batch结果往往会较差。 上图中&#xff0c;横轴代表batch size&#xff0c;从左到右越来越大&#xff1b;纵轴代表准确率acc&#xff0c;越往上正确率越来越高。 在观察validation上的结果时&…

【数据结构与算法】基础数据结构

文章目录 数组概述动态数组二维数组局部性原理越界检查 链表概述单向链表单向链表&#xff08;带哨兵&#xff09;双向链表&#xff08;带哨兵&#xff09;环形链表&#xff08;带哨兵&#xff09; 队列概述链表实现环形数组实现 栈概述链表实现数组实现应用 双端队列概述链表实…

Android内部存储与外部存储(私有目录与公共目录)图文详解

目录 一、存储空间概述 二、存储空间的划分 1、存储划分 2、内部存储 2.1 内部存储概述 2.2 内部存储 - 私有目录 3. 外部存储 3.1 外部存储概述 3.2 外部存储 - 私有目录 3.3 外部存储 - 公共目录 三、内部存储与外部存储比较 1、横向对比 2、目录结构 3、存储分…

English Learning - L3 作业打卡 Lesson3 Day15 2023.5.19 周五

English Learning - L3 作业打卡 Lesson3 Day15 2023.5.19 周五 引言&#x1f349;句1: We present more expressions about food.成分划分连读爆破语调 &#x1f349;句2: They are from Elenir Scardueli, a listener in Brazil.成分划分弱读连读语调 &#x1f349;句3: My m…

plsql为什么连不上远程或本地的Oracle,需要做哪些准备?

文件配置解说 tnsnames.ora文件 文件所在地址&#xff1a;ORACLE_HOME\network\admin ORACLE_HOME&#xff1a;Oracle数据库或者客户端软件所在的地址 但是我的在Oracle数据库的目录下&#xff0c;而不是Oracle客户端软件&#xff08;instantclient_11_2&#xff09;下 里…

分布式架构设计及理论指导

目录 核心概念分布式分布式SOA架构微服务架构微服务技术对比 服务拆分拆分思想和原则创建父类工程创建子工程 远程调用方式引入RestTemplate CAP/BASE理论CAP理论分区容错 &#xff08;Partition-tolerance&#xff09;一致性&#xff08;Consistency&#xff09;可用性&#x…

【C++】继承/虚拟继承/菱形虚拟继承

继承 继承的概念继承体系中对象赋值转换继承方式对继承后的访问限定&#xff08;重定义-同名隐藏&#xff09;继承体系中派生类的默认成员函数友元函数、静态成员在继承中的特点菱形继承和菱形虚拟继承 继承的概念 为了让代码可以复用&#xff0c;当前类可以继承其他类的成员变…

阿里云OSS存储空间绑定自定义域名,浏览器通过自定义域名预览文件

阿里云官方文档&#xff1a; 如何绑定自定义域名_对象存储-阿里云帮助中心 华东1&#xff08;杭州&#xff09;地域创建了名为monkey的存储空间 Bucket&#xff1a;monkey Endpoint&#xff1a;oss-cn-hangzhou.aliyuncs.com 上传文件默认域名的url: https://monkey.oss-cn-han…

微信小程序nodejs+vue课程推荐报名学习分享平台uniapp

本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c; 整个开发过程首先对课程分享平台进行需求分析&#xff0c;得出课程分享平台主要功能。接着对课程分享平台 进行总体设计和详细设计。总体设计主要包括小程序功能设计、小程序总体结构设计、小程序…

Python数据可视化小结

1. 引言 原始形式的数据对大多数人来说可能都是枯燥乏味的&#xff0c;但是如果掌握正确的可视化工具&#xff0c;给人的印象就会变得引人入胜。本文通过实际例子&#xff0c;让我们利用数据可视化工具来探索不一样的数据体验。 闲话少说&#xff0c;我们直接开始吧&#xff…

推荐3款超好用的海报设计软件!

在现代社会&#xff0c;海报设计已经成为了一种非常重要的视觉传达方式。如果你需要制作一个引人注目的海报&#xff0c;但却没有设计师的技能和经验&#xff0c;那么在线海报设计图片软件就是你的最佳选择。下面我们将介绍 5 款最受欢迎的在线海报设计图片软件&#xff0c;它们…

qt中使用QGIS实现二次开发导入shp格式地图(MSVC2019_64bit+qt5.15+qgis)

在qt开发过程中可能要导入自定义格式的图层地图&#xff0c;那么可以把这些数据导入qgis然后导出为shp格式文件&#xff0c;然后下载qgis源码&#xff0c;在qt项目中配置环境变量导入qgis有关的头文件&#xff0c;然后再引入shp数据格式的地图。 qgis处理数据 QGIS安装 QGIS…

oracle数据库当中用户的创建,添加,授权,以及表的创建与表的简单介绍,以及在oracle数据库当中的约束以及约束条件的简单介绍

系列文章目录 (3条消息) oracle数据库简介 文章目录 系列文章目录 前言 一、用户的创建 1.1、创建命令 1.2、给予scott用户权限 1.3、以scott用户进行连接登录 二、表和表的设计原则 2.1、表的概念 2.1.1、表是从属于用户的 2.1.2、表是逻辑表(概念表)&#xff0c;不…

[比赛简介]Predict Student Performance from Game Play

比赛链接&#xff1a;https://www.kaggle.com/competitions/predict-student-performance-from-game-play/overview 比赛简介 本次比赛的目标是实时预测学生在基于游戏的学习中的表现。您将开发一个在最大的游戏日志开放数据集之一上训练的模型。 您的工作将有助于推进对基于…

Next.js ---未完待续....

Next.js 1.介绍2.体会服务器端渲染2.1为什么这就服务器端渲染了&#xff1f; 3.如何判断是否是服务器端渲染&#xff1f;--- 响应头信息4.文件名路由5.如何启动项目*另外1.Next.js 是基于 Webpack 的框架&#xff1f;1.1所以无需手动编译 TypeScript 代码 1.介绍 Next.js 是一…