spring boot 使用 webservice

news2024/11/16 13:32:59

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 {

    @WebMethod
    public boolean addHuman(Human human);

    @WebMethod
    public boolean deleteHuman(String name);

    @WebMethod
    public Human get(String name);

    /**
     * 不能处理List, 只能处理数组
     * @return
     */
    @WebMethod
    public 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<>();

    @Override
    public boolean addHuman(Human human) {
        data.put(human.getName(), human);
        return true;
    }

    @Override
    public boolean deleteHuman(String name) {
        data.remove(name);
        return true;
    }

    @Override
    public Human get(String name) {
        return data.get(name);
    }

    @Override
    public 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=实现类+Service
        QName 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);
    }


    @Override
    public boolean addHuman(Human human) {
        return super.getPort(HumanService.class).addHuman(human);
    }

    @Override
    public boolean deleteHuman(String name) {
        return super.getPort(HumanService.class).deleteHuman(name);
    }

    @Override
    public Human get(String name) {
        return super.getPort(HumanService.class).get(name);
    }

    @Override
    public Human[] getAll() {
        return super.getPort(HumanService.class).getAll();
    }
}

调用

@RestController
public class HumanWebServiceClientController {

    @Autowired
    private 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!

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

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

相关文章

JVM-3

HotSpot虚拟机对象 我在网上看了很多相关的文章&#xff0c;发现在创建对象和对象的结构中内容都不太一样&#xff0c;一些关键字也很不同&#xff0c;于是我通过参考《深入理解Java虚拟机》这本书&#xff0c;自己总结了一篇。 1.对象的创建 当JVM收到一条创建对象的字节码…

uniapp:音乐播放器

功能要求&#xff1a;全局音乐播放&#xff0c;可以上一首&#xff0c;下一首&#xff0c;暂停&#xff0c;播放。 1、mixins export default {data() {return {audio: null, // 音频对象playlist: [{url: require(../static/1.mp3)}, {url: require(../static/2.mp3)}, {url: …

多接入边缘计算赋能的AI质检系统任务实时调度策略

源自&#xff1a;电子与信息学报 作者&#xff1a;周晓天, 孙上, 张海霞, 邓伊琴, 鲁彬彬 “人工智能技术与咨询” 发布 摘 要 AI质检是智能制造的重要环节&#xff0c;其设备在进行产品质量检测时会产生大量计算密集型和时延敏感型任务。由于设备计算能力不足&#xff0c…

少儿编程机器人技术架构解析与实现流程

随着科技的飞速发展&#xff0c;少儿编程机器人成为了越来越受欢迎的教育工具&#xff0c;为孩子们提供了学习编程的新途径。在这篇文章中&#xff0c;我们将深入探讨少儿编程机器人的技术架构和实现过程&#xff0c;揭示背后的技术原理和开发策略。同时&#xff0c;我们也将介…

java-ssm-基于jsp商场停车服务管理信息系统

java-ssm-基于jsp商场停车服务管理信息系统

http协议中的强缓存与协商缓存,带图详解

此篇抽自本人之前的文章&#xff1a;http面试题整理 。 别急着跳转&#xff0c;先把缓存知识学会了~ http中的缓存分为两种&#xff1a;强缓存、协商缓存。 强缓存 响应头中的 status 是 200&#xff0c;相关字段有expires&#xff08;http1.0&#xff09;,cache-control&…

案例分析篇03:一篇文章搞定软考设计模式考点(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12593400.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

Django环境下使用Ajax

Django环境下使用Ajax 目录 Django环境下使用Ajax介绍前情提要示例JS实现Ajax实现 传递JSON格式数据传递文件数据Django自带的序列化组件基于jsonresponse序列化数据基于Django自带的serializers 注册示例 介绍 AJAX 的主要目标是在不刷新整个页面的情况下&#xff0c;通过后台…

活动图高阶讲解-02

130 00:07:05,080 --> 00:07:06,680 这是历史 131 00:07:06,680 --> 00:07:11,400 那么在这个过程中 132 00:07:11,400 --> 00:07:14,840 就会出现多种变体了 133 00:07:14,840 --> 00:07:15,560 一个变体 134 00:07:15,560 --> 00:07:16,640 就是BPMN 135…

7.无重复字符的最长字串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为…

【包邮送书】Elasticsearch 通过索引阻塞实现数据保护深入解析

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

【C++干货基地】面向对象核心概念与实践原理:拷贝构造函数的全面解读

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

Learn OpenGL 07 摄像机

定义摄像机参数 glm::vec3 cameraPos glm::vec3(0.0f, 0.0f, 3.0f);//摄像机位置glm::vec3 cameraTarget glm::vec3(0.0f, 0.0f, 0.0f);glm::vec3 cameraDirection glm::normalize(cameraPos - cameraTarget);//摄像机方向&#xff0c;指向z轴正方向 glm::vec3 up glm::vec…

套接字编程 --- 三

目录 1. 前置性知识 1.1. listen 系统调用 1.2. accept 系统调用 1.3. 如何通信 1.3.1. read 系统调用 && write系统调用 1.3.2. recv 系统调用 && send 系统调用 2. TCP --- demo 2.1. Tcp_Server.hpp (version 1) 2.2. Tcp_Server.hpp (version 2…

[AIGC] Kafka解析:分区、消费者组与消费者的关系

Apache Kafka是一个分布式事件流平台&#xff0c;它是处理实时数据的强大工具。而理解Kafka的关键概念&#xff1a;分区&#xff08;Partition&#xff09;、消费者组&#xff08;Consumer Group&#xff09;和消费者&#xff08;Consumer&#xff09;的关系对于正确地使用Kafk…

C语言--- 指针运算笔试题详解

目录 题目1&#xff1a; 题目2&#xff1a; 题目3&#xff1a; 题目4&#xff1a; 题目5&#xff1a; 题目6&#xff1a; 题目7&#xff1a; 题目1&#xff1a; #include <stdio.h> int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);print…

C#与WPF通用类库

个人集成封装&#xff0c;仓库已公开 NetHelper 集成了一些常用的方法&#xff1b; 如通用的缓存静态操作类、常用的Wpf的ValueConverters、内置的委托类型、通用的反射加载dll操作类、Wpf的ViewModel、Command、Navigation、Messenger、部分常用UserControls(可绑定的Passwo…

蓝桥杯-ISBN号码

此题然让本人纠结了很久&#xff0c;真的好多坑。。。。果然还是太菜了。 完整代码以及思路解析(在注释中) #include <iostream> using namespace std; int main() {string num;cin>>num; int count0;int w1;for(int i0;i<10;i){if((i!1)&&(i!5)) //坑…

Node.js作用

Node.js可以开发应用 开发服务器应用 开发工具类应用 开发桌面端应用

Discord OAuth2授权以及机器人监听群事件

下面文章讲解获取OAuth2授权整个流程&#xff0c;创建机器人&#xff0c;使用机器人监听工会&#xff08;工会就是创建的服务器&#xff09;成员变化等等&#xff0c;对接国外的都是需要VPN的哦&#xff0c;对接的时候记得提前准备。 创建应用 点击 此页面添加应用,&#xff…