当前位置: 首页 > news >正文

spring boot 使用 webservice

spring boot 使用 webservice

使用 java 自带的 jax-ws

依赖

如果是jdk1.8,不需要引入任何依赖,如果大于1.8

<dependency><groupId>javax.jws</groupId><artifactId>javax.jws-api</artifactId><version>1.1</version>
</dependency>
<dependency><groupId>javax.xml.ws</groupId><artifactId>jaxws-api</artifactId>
</dependency>

定义服务接口

使用 @WebService 注解

@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public interface HumanService {@WebMethodpublic boolean addHuman(Human human);@WebMethodpublic boolean deleteHuman(String name);@WebMethodpublic Human get(String name);/*** 不能处理List, 只能处理数组* @return*/@WebMethodpublic Human[] getAll();}

实现

package com.example.demoweb.webservice.impl;import com.example.demoweb.model.Human;
import com.example.demoweb.webservice.HumanService;
import org.springframework.util.CollectionUtils;import javax.jws.WebService;
import java.util.*;/*** @Author: xiaodong.zheng* @Date: 2024/3/7 15:36*/
@WebService(endpointInterface = "com.example.demoweb.webservice.HumanService",serviceName = "HumanService",targetNamespace = "human.ns" //随便写,不过在客户端调用时会用到
)
public class HumanServiceImpl implements HumanService {private Map<String, Human> data = new HashMap<>();@Overridepublic boolean addHuman(Human human) {data.put(human.getName(), human);return true;}@Overridepublic boolean deleteHuman(String name) {data.remove(name);return true;}@Overridepublic Human get(String name) {return data.get(name);}@Overridepublic Human[] getAll() {if (CollectionUtils.isEmpty(data)) {return null;}Human[] hs = new Human[data.size()];int i = 0;for (Map.Entry<String, Human> entry : data.entrySet()) {hs[i] = entry.getValue();i++;}return hs;}
}

暴露端口

@SpringBootApplication
public class DemoWebApplication {public static final String WS_HUMAN = "http://localhost:8888/ws/hh";public static void main(String[] args) {//注意webservice服务发布会优先于spring容器启动,不然 使用依赖注入会失败!!Endpoint.publish(WS_HUMAN, new HumanServiceImpl());SpringApplication.run(DemoWebApplication.class, args);}}

访问 http://localhost:8888/ws/hh?wsdl

在这里插入图片描述

webservice客户端调用

动态调用

@RestController
public class HumanWebServiceClientController {@GetMapping("/index")public String invoke() throws MalformedURLException {//public static final String WS_HUMAN = "http://localhost:8888/ws/hh";URL wsdlURL = new URL(WS_HUMAN + "?wsdl");//默认localPart=实现类+ServiceQName qname = new QName("human.ns", "HumanService");Service service = Service.create(wsdlURL, qname);HumanService humanService = service.getPort(HumanService.class);Human human = new Human();human.setName("tom");human.setAge(12);boolean b = humanService.addHuman(human);System.out.println("add human: " + b);Human[] all = humanService.getAll();System.out.println("get all data: " + JSON.toJSONString(all));return "success";}
}

依赖注入调用

使用 @WebServiceClient 注解, 调用者客户端:

@Component
@WebServiceClient(targetNamespace = "human.ns", wsdlLocation = WS_HUMAN + "?wsdl",name = "HumanService")
public class HumanServiceClient extends Service implements HumanService {public final static QName SERVICE = new QName("human.ns", "HumanService");public HumanServiceClient() throws MalformedURLException {super(new URL(WS_HUMAN + "?wsdl"), SERVICE);}@Overridepublic boolean addHuman(Human human) {return super.getPort(HumanService.class).addHuman(human);}@Overridepublic boolean deleteHuman(String name) {return super.getPort(HumanService.class).deleteHuman(name);}@Overridepublic Human get(String name) {return super.getPort(HumanService.class).get(name);}@Overridepublic Human[] getAll() {return super.getPort(HumanService.class).getAll();}
}

调用

@RestController
public class HumanWebServiceClientController {@Autowiredprivate HumanServiceClient humanServiceClient;@GetMapping("/index2")public String invoke2() throws MalformedURLException {Human human = new Human();human.setName("tom");human.setAge(13);boolean b = humanServiceClient.addHuman(human);System.out.println("add human: " + b);Human[] all = humanServiceClient.getAll();System.out.println("get all data: " + JSON.toJSONString(all));return "success";}}

结果:

add human: true
get all data: [{"age":13,"name":"tom"}]

good luck!

相关文章:

spring boot 使用 webservice

spring boot 使用 webservice 使用 java 自带的 jax-ws 依赖 如果是jdk1.8,不需要引入任何依赖&#xff0c;如果大于1.8 <dependency><groupId>javax.jws</groupId><artifactId>javax.jws-api</artifactId><version>1.1</version&g…...

【嵌入式】嵌入式系统稳定性建设:最后的防线

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟。提供嵌入式方向的学习指导、简历面…...

【算法】一类支持向量机OC-SVM

【算法】一类支持向量机OC-SVM 前言一类支持向量机OC-SVM 概念介绍示例编写数据集创建实现一类支持向量机OC-SVM完整的示例输出 前言 由于之前毕设期间主要的工具就是支持向量机&#xff0c;从基础的回归和分类到后来的优化&#xff0c;在接触到支持向量机还有一类支持向量机的…...

深入学习默认成员函数——c++指南

前言&#xff1a;类和对象是面向对象语言的重要概念。 c身为一门既面向过程&#xff0c;又面向对象的语言。 想要学习c&#xff0c; 首先同样要先了解类和对象。 本节就类和对象的几种构造函数相关内容进行深入的解析。 目录 类和对象的基本概念 封装 类域和类体 访问限定符…...

psutil, 一个超级有用的Python库

Python的psutil是一个跨平台的库&#xff0c;可以用于获取系统运行时的各种信息&#xff0c;包括CPU使用率、内存使用情况、磁盘和网络信息等。它主要用来做系统监控&#xff0c;性能分析&#xff0c;进程管理。它实现了同等命令行工具提供的功能&#xff0c;如ps、top、lsof、…...

[Python]`threading.local`创建线程本地数据

在Python中&#xff0c;threading.local是一个用于创建线程本地数据的工具。它允许每个线程拥有自己独立的变量副本&#xff0c;这样可以在多线程程序中避免共享变量带来的问题。 通过使用threading.local&#xff0c;你可以为每个线程创建一个独立的变量空间&#xff0c;这样…...

删除数据表

oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 删除数据表属于数据库对象的操作 drop table 表名称; 删除 emp30 表 SQL> drop table emp30;表已删除。 上面这个语句运行后&#xff0c;就会把数据表 emp30 删除 在…...

前端自带的base64转化方法

前端html的base64使用方法window.btoa()和window.atob()_html用window.btoa();-CSDN博客...

图论(二)之最短路问题

最短路 Dijkstra求最短路 文章目录 最短路Dijkstra求最短路栗题思想题目代码代码如下bellman-ford算法分析只能用bellman-ford来解决的题型题目完整代码 spfa求最短路spfa 算法思路明确一下松弛的概念。spfa算法文字说明&#xff1a;spfa 图解&#xff1a; 题目完整代码总结ti…...

.NET Core 日志记录功能详解

在软件开发和运维过程中&#xff0c;日志记录是一个非常重要的功能。它可以帮助开发者跟踪应用程序的运行状况、诊断和监控问题。.NET Core 提供了一个灵活且易于使用的日志系统&#xff0c;本文将详细介绍.NET Core日志的相关概念、配置和使用方法。 1. 什么是日志记录以及它…...

docker——启动各种服务

1.Mysql 2.Redis 3.nginx 4.ES 注意&#xff1a;ES7之后环境为 -e ELASTICSEARCH_HOSTS http://ip地址:9200...

git远程仓库使用

赋值这个地址clone 克隆之后 cd slam_oncloud/ git remote add chenxnew ssh://git192.168.3.40:1022/chenxiao/slam_oncloud.git 查看一下 linuxchenxiao:/media/linux/mydisk/cloud_slam/slam_oncloud$ git remote add chenxnew ssh://git192.168.3.40:1022/chenxiao/sla…...

js导出的excel文件无法打开/打开乱码,excel无法打开xxx.xlsx因为文件格式或文件扩展无效

excel无法打开xxx.xlsx因为文件格式或文件扩展无效 使用 a 标签导出这里就不细说了&#xff0c;直接说上述问题解决方案 在调用导出接口的时候加上两个参数 responseType: “blob” responseEncoding: “utf8” export function test(data) {return util({url: /test,method: …...

透明多级分流系统(用户端缓存和负载均衡)

部件考虑 有些设备位于客户端或者网络边缘&#xff0c;能够迅速响应用户请求&#xff0c;避免给cpu和数据库带来压力&#xff0c;比如&#xff0c;本地缓存&#xff0c;内容分发网络&#xff0c;反向代理等。 有些设备处理能力能够线性扩展&#xff0c;易于伸缩&#xff0c;应…...

Python sort从大到小排序面试题

在Python中&#xff0c;你可以使用内置的sorted()函数或者列表的sort()方法来对列表中的元素进行从大到小的排序。 使用sorted()函数&#xff1a; numbers [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5] sorted_numbers sorted(numbers, reverseTrue) # 设置reverseTrue实现从大到小排…...

【Stable Diffusion】入门:AI绘画提示词+参数设置攻略

目录 1 提示词1.1 分类和书写方式1.1.1 内容型提示词1.1.2 标准化提示词1.1.3 通用模板 1.2 权重1.2.1 套括号1.2.2 数字权重1.2.3 进阶语法 1.3 负面提示词 2 参数详解2.1 Sampling steps2.2 Sampling method2.3 Width, Height2.4 CFG Scale2.5 Seed2.6 Batch count, Batch si…...

Qt使用Q_DECLARE_INTERFACE Q_INTERFACES宏实现接口类使用qobject_cast进行类型转换

在写抽象类或者接口的时候&#xff0c;肯定是不能继承QObject的 但是又想使用qobject_cast进行类型转换&#xff0c;使用以下办法就能实现 #ifndef FACTORYINTERFACE_H__ #define FACTORYINTERFACE_H__ #include <QObject> class FactoryInterface{ public:FactoryInterf…...

docker离线搭建仓库

要在Docker中搭建本地仓库&#xff0c;可以按照以下步骤进行操作&#xff1a; 首先安装 Docker。根据不同的操作系统选择合适的版本并完成安装过程。打开命令行工具&#xff08;如Terminal或PowerShell&#xff09;&#xff0c;运行以下命令来创建一个新的容器并将其设置为本地…...

ABC344 A-E题解

文章目录 A题目AC Code&#xff1a; B题目AC Code&#xff1a; C题目AC Code&#xff1a; D题目AC Code&#xff1a; E题目AC Code&#xff1a; 不易不难&#xff0c;写到5题很简单&#xff0c;但是要有足够的思维能力。 A 题目 我们用一个 flag 变量记录我们是不是在两个竖…...

Jeecg-boot 初次启动项目失败

1.将IDEA的字符编码全部改成utf-8 2. 更改database的密码 3.换个jdk重新启动...

Nigate:Mac NTFS全功能读写解决方案——面向跨平台用户的高效文件交互指南

Nigate&#xff1a;Mac NTFS全功能读写解决方案——面向跨平台用户的高效文件交互指南 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting…...

数据开发者的AI转型:大模型应用实录

1️⃣需求解析&辅助研发 这个功能其实很有意思&#xff0c;我们迭代了两期。 第一期&#xff0c;其实这个功能一开始设计的比较天马行空&#xff0c;就是直接给一个需求进来&#xff0c;然后直接给你开发好。但是研发了半个月叫停了&#xff0c;发现模型根本理解不了整个需…...

Ubuntu20.04下Intel RealSense设备开发环境搭建:从libRealsense SDK 2.0到ROS Wrapper全流程指南

1. 环境准备与基础概念 在Ubuntu 20.04上搭建Intel RealSense开发环境前&#xff0c;我们需要明确几个关键概念。librealsense SDK 2.0是Intel官方提供的底层驱动库&#xff0c;负责与硬件直接通信&#xff1b;而ROS Wrapper则是将SDK功能封装成ROS节点&#xff0c;让深度相机数…...

【车载C#中控系统开发黄金法则】:20年一线专家亲授5大避坑指南与实时响应优化秘技

第一章&#xff1a;车载C#中控系统开发的实时性本质与架构约束车载C#中控系统并非通用桌面应用的简单移植&#xff0c;其核心挑战源于汽车电子环境对确定性响应、资源隔离与功能安全的刚性要求。实时性在此语境下并非指微秒级硬实时&#xff08;如ECU控制&#xff09;&#xff…...

解锁音乐自由:QMCDecode让QQ音乐加密文件变身通用音频格式

解锁音乐自由&#xff1a;QMCDecode让QQ音乐加密文件变身通用音频格式 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#xff0c;默…...

推三返一小程序(源码部署)

推三返一小程序源码部署指南环境准备确保已安装Node.js&#xff08;建议版本14&#xff09;、微信开发者工具、MySQL数据库&#xff08;或云数据库&#xff09;。 克隆或下载推三返一小程序源码至本地&#xff0c;检查package.json确认依赖完整性。后端配置修改server/config.j…...

从PPO到ORPO:LLaMA Factory强化学习算法技术详解

在大语言模型的偏好对齐训练中,算法选择直接影响训练成本和最终效果。LLaMA Factory 支持从经典的 PPO 到最新的 DPO、SimPO、KTO、ORPO 等多种强化学习算法,但它们的原理差异、适用场景和资源开销各不相同。 本文系统梳理五大算法的理论基础、关键公式和工程实现,通过 Onli…...

SVA断言实战指南:从基础语法到复杂时序验证

1. SVA断言入门&#xff1a;从基础语法开始 第一次接触SystemVerilog断言(SVA)时&#xff0c;我完全被那些奇怪的符号搞懵了。什么"##"、"|->"、"intersect"&#xff0c;看起来就像天书一样。但当我真正理解了这些符号背后的逻辑后&#xff0…...

非线性悬架与UKF状态估计的Matlab/Simulink建模源码及文档资料

非线性悬架&#xff0c;UKF状态估计 软件使用&#xff1a;Matlab/Simulink 适用场景&#xff1a;采用模块化建模方法&#xff0c;搭建空气悬架模型&#xff0c;UKF状态估计模型&#xff0c;可实现悬架动挠度等状态估计。 包含&#xff1a;simulink源码文件&#xff0c;详细建模…...

Klipper配置TMC2209避坑指南:UART模式下的74HC4066切换电路详解

Klipper配置TMC2209避坑指南&#xff1a;UART模式下的74HC4066切换电路详解 在3D打印机DIY领域&#xff0c;TMC2209驱动芯片凭借其静音性能和精细控制能力广受欢迎。但许多玩家在尝试UART模式配置时&#xff0c;常常遇到多个电机同时响应、信号干扰等棘手问题。本文将深入解析7…...