webservice之jax-ws实现方式(服务端)
1.什么是webservice?
webservice是一种远程资源调用技术,它的实现方式主要分为两种,
第一种是jaxws方式,它是面向方法的,它的数据类型是xml是基于soap实现传输;
第二种是jaxrs方式,它是面向资源的,它的数据类型是xml或json是基于http协议实现传输。
2.jaxws简单应用
服务端:
第一步:创建一个简单的web项目,略
第二步:添加webService的依赖jar包,配置web.xml
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.0.1</version>
</dependency>
注:版本需与springboot对应 否则启动就会报错
在https://mvnrepository.com/artifact/org.apache.cxf/cxf-spring-boot-starter-jaxws查找到jaxws的各种版本,进入之后可以看到对应的springboot版本

问题详情:
Description: Parameter 1 of constructor in org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration required a bean of type ‘org.springframework.boot.autoconfigure.web.servlet.DispatcherServletPath’ that could not be found. The following candidates were found but could not be injected:
- Bean method ‘dispatcherServletRegistration’ in ‘DispatcherServletAutoConfiguration.DispatcherServletRegistrationConfiguration’ not loaded because DispatcherServlet Registration found non dispatcher servlet dispatcherServlet Action: Consider revisiting the entries above or defining a bean of type ‘org.springframework.boot.autoconfigure.web.servlet.DispatcherServletPath’ in your configuration. Process finished with exit code 1
启动报错(版本问题)
第三步:编写代码

1 import com.test.demo.service.IDataReceiverService;
2 import org.apache.cxf.Bus;
3 import org.apache.cxf.jaxws.EndpointImpl;
4 import org.springframework.beans.factory.annotation.Autowired;
5 import org.springframework.context.annotation.Bean;
6 import org.springframework.context.annotation.Configuration;
7
8 import javax.xml.ws.Endpoint;
9
10 /**
11 * 〈cxf配置〉
12 * 默认:services
13 * http://127.0.0.1:6689/services/receiveData
14 * cxf-path配置路径:
15 * http://127.0.0.1:6689/soap/receiveData
16 */
17 @Configuration
18 public class CxfConfig {
19
20 @Autowired
21 private Bus bus;
22
23 @Autowired
24 private IDataReceiverService dataReceiverService;
25
26
27 /**
28 * 数据站点服务(总入口)
29 *
30 * @return
31 */
32 @Bean
33 public Endpoint getReceiveData() {
34 EndpointImpl endpoint = new EndpointImpl(bus, dataReceiverService);
35 endpoint.publish("/receiveData");
36 return endpoint;
37 }
38
39 }
CxfConfig

1 package com.test.demo.service;
2
3
4 import com.test.demo.entity.ReceiveMsg;
5
6 import javax.jws.WebMethod;
7 import javax.jws.WebParam;
8 import javax.jws.WebService;
9
10 /**
11 * 接收数据处理服务类
12 *
13 * @Author: zhangt
14 * @Date: 2021/9/11 11:46
15 */
16
17 @WebService
18 public interface IDataReceiverService {
19
20
21 /**
22 * 接收数据接口
23 *
24 * @param receiveMsg 数据
25 * @return
26 */
27 @WebMethod
28 String getReceiveMsg(@WebParam(name = "ROOT") ReceiveMsg receiveMsg);
29
30 }
service

1 package com.test.demo.service.impl;
2
3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.convert.Convert;
5 import com.test.demo.entity.ReceiveMsg;
6 import com.test.demo.entity.ResultMsg;
7 import com.test.demo.entity.UploadData;
8 import com.test.demo.service.IDataReceiverService;
9 import com.test.demo.util.ReceiveMsgUtil;
10 import lombok.extern.slf4j.Slf4j;
11 import org.dom4j.DocumentException;
12 import org.springframework.stereotype.Component;
13
14 import javax.jws.WebService;
15 import java.util.List;
16 import java.util.Map;
17
18 @WebService(serviceName = "receiverService", // 与接口中指定的name一致
19 targetNamespace = "http://service.demo.test.com", // 与接口中的命名空间一致,一般是接口的包名倒序排
20 endpointInterface = "com.test.demo.service.IDataReceiverService"// 接口地址
21 )
22 @Slf4j
23 @Component
24 public class DataReceiverServiceImpl implements IDataReceiverService {
25
26 /**
27 * 接收数据接口
28 *
29 * @param receiveMsg 数据
30 * @return
31 */
32 @Override
33 public String getReceiveMsg(ReceiveMsg receiveMsg) {
34
35 //解析报文,转化为需要写成文件的数据
36 UploadData uploadData = new UploadData();
37 String dataId = receiveMsg.getDATAID();
38 uploadData.setDataId(dataId);
39 //是否加密 (1 表示业务数据为密文传输,0 表示明文)
40 int sec = Convert.toInt(receiveMsg.getSEC());
41 uploadData.setHavePwd(sec);
42
43 //数据为明文时
44 if (1 == sec) {
45 //解码业务报文
46 try {
47 //获取解密后的业务数据
48 String data = ReceiveMsgUtil.decodeStr(receiveMsg.getBUSINESSCONTENT());
49 List<Map<String, Object>> list = ReceiveMsgUtil.xmlToList(data);
50 log.info("数据为list:{}", list);
51 uploadData.setBusinessData(list);
52 if (CollUtil.isEmpty(list)) {
53 return ResultMsg.getMessage(ResultMsg.BUSINESS_DATA_ANALYZE_ERROR);
54 }
55 } catch (DocumentException e) {
56 log.info("xml数据格式不正确!", e);
57 return ResultMsg.getMessage(ResultMsg.XML_ERROR);
58 } catch (Exception e) {
59 log.info("base64解码错!", e);
60 return ResultMsg.getMessage(ResultMsg.BASE64_ERROR);
61 }
62 }
63
64 return ResultMsg.getMessage(ResultMsg.SUCCESS);
65 // return uploadData.getReplyData();
66 }
67
68 }
serviceImpl

1 server:
2 port: 6689
3 spring:
4 application:
5 name: cxfDemo
6 # profiles:
7 # active: dev
8 cxf:
9 path: /soap #默认services
yml
第四步:启动项目,查看wsdl说明书
这里面的路径注意cxf在web中的配置:

参数说明:
@WebService:在接口上申明,表示该接口是一个webService服务;
@WebMethod:在接口方法上声明,表示该方法是一个webService服务方法;
@WebService(endpointInterface="cn.linc.cxf.interfaces.ServiceUI",serviceName="userService"):在该接口实现类定义;
endpointInterface:表示接口服务终端接口名;
serviceName:服务名称;
wsdl解读:有五个节点:服务视图,服务协议和参数的描述,服务实现,参数描述,参数类型描述。
调用展示:

原理解析:
可以分为三个角色:服务提供者,服务消费者,服务注册中心uddi
首先由服务提供者发布服务并且在注册中心uddi进行注册
然后由服务消费者订阅服务,在注册中心uddi上查询到符合条件的服务
服务注册中心返回服务条件服务的描述文件给服务订阅者
订阅者根据描述文件进行服务端的服务调用,并返回数据。
工具:
加解密:https://tool.oschina.net/encrypt
soapUI:https://www.soapui.org/downloads/soapui/
参考:
https://blog.csdn.net/qiaodaima0/article/details/100765613
https://www.cnblogs.com/xiechenglin/p/10500558.html
https://www.cnblogs.com/shuaijie/articles/5913750.html
webservice之jax-ws实现方式(服务端)的更多相关文章
- node.js中ws模块创建服务端和客户端,网页WebSocket客户端
首先下载websocket模块,命令行输入 npm install ws 1.node.js中ws模块创建服务端 // 加载node上websocket模块 ws; var ws = require( ...
- 微信小程序访问webservice(wsdl)+ axis2发布服务端(Java)
0.主要思路:使用axis2发布webservice服务端,微信小程序作为客户端访问.步骤如下: 1.服务端: 首先微信小程序仅支持访问https的url,且必须是已备案域名.因此前期的服务器端工作需 ...
- cxf webservice生成客户端代码及调用服务端遇到的问题
1. 从网上下载cxf开发的工具 apache-cxf-3.1.4.zip, 解压文件,找到apache-cxf-3.1.4\bin目录,里面包含一个wsdl2java文件 2. 设置环境变量 1. ...
- JAVA WEBSERVICE服务端&客户端的配置及调用(基于JDK)
前言:我之前是从事C#开发的,因公司项目目前转战JAVA&ANDROID开发,由于对JAVA的各种不了解,遇到的也是重重困难.目前在做WEBSERVICE提供数据支持,看了网上相关大片的资料也 ...
- React 服务端渲染最佳解决方案
最近在开发一个服务端渲染工具,通过一篇小文大致介绍下服务端渲染,和服务端渲染的方式方法.在此文后面有两中服务端渲染方式的构思,根据你对服务端渲染的利弊权衡,你会选择哪一种服务端渲染方式呢? 什么是服务 ...
- http服务端架构演进
摘要 在详解http报文相关文章中我们介绍了http协议是如何工作的,那么构建一个真实的网站还需要引入组件呢?一些常见的名词到底是什么含义呢? 什么叫正向代理,什么叫反向代理 服务代理与负载均衡的差别 ...
- React 服务端渲染方案完美的解决方案
最近在开发一个服务端渲染工具,通过一篇小文大致介绍下服务端渲染,和服务端渲染的方式方法.在此文后面有两中服务端渲染方式的构思,根据你对服务端渲染的利弊权衡,你会选择哪一种服务端渲染方式呢? 什么是服务 ...
- 判断python socket服务端有没有关闭的方法
通过 getattr(socket, '_closed') 的返回值可以判断服务端的运行状态. True 是关闭状态,False 是运行中. import socket ip = 'localhost ...
- webservice快速入门-使用JAX-WS注解的方式快速搭建ws服务端和客户端(一)
1.定义接口 package org.WebService.ws.annotation; import javax.jws.WebService; @WebService public interfa ...
- Maven搭建webService (二) 创建服务端---使用web方式发布服务
今天和大家分享 使用 web方式发布 webService 服务端.客户端 1.首先创建 一个web工程(增加Maven依赖) 2.增加Maven依赖包,如下: <!-- spring core ...
随机推荐
- [转帖]《Linux性能优化实战》笔记(七)—— CPU瓶颈快速分析及性能优化思路
相当于是前面篇章的小结 一. CPU 性能指标 常见指标包括: 平均负载 CPU 使用率(user.iowait.system.软硬中断等) 进程上下文切换(自愿.非自愿) CPU 缓存的命中率 CP ...
- [转帖]Jmeter学习笔记(二十三)——生成HTML性能报告
https://www.cnblogs.com/pachongshangdexuebi/p/11759316.html 有时候我们写性能报告的时候需要一些性能分布图,JMeter是可以生成HTML性能 ...
- [转帖]5、kafka监控工具Kafka-Eagle介绍及使用
https://zhuanlan.zhihu.com/p/628039102 # Apache Kafka系列文章 1.kafka(2.12-3.0.0)介绍.部署及验证.基准测试 2.java调 ...
- [转帖]CPU缓存行
https://www.jianshu.com/p/e338b550850f CPU缓存 执行程序是靠运行CPU执行主存中代码,但是CPU和主存的速度差异是非常大的,为了降低这种差距,在架构中使用了C ...
- redis 6源码解析之 事件
redis的事件分为:文件事件和时间事件.文件事件是基于I/O的事务处理,时间事件则是基于时间点的事务处理.redis事件支持的多路复用包含四个实现:ae_epoll.c,ae_evport.c,ae ...
- Docker系列教程01--简介
Docker 入门教程 作者: 阮一峰 日期: 2018年2月 9日 2013年发布至今, Docker 一直广受瞩目,被认为可能会改变软件行业. 但是,许多人并不清楚 Docker 到底是什么, ...
- Windows堆管理机制 [1] 堆基础
声明:这篇文章在写的时候,是最开始学习这个堆管理机制,所以写得有些重复和琐碎,基于笔记的目的想写得全一些,这篇文章写的时候参考了很多前辈的文章,已在末尾标出,某些未提及到的可以在评论补充 基于分享的目 ...
- x86 x64 arm64的区别
我们常说的高通 865,麒麟990 不是 CPU 是 SoC(System On Chip),SoC 除了 CPU 外,还有 GPU,还有可选的浮点数加速器,专用于深度模型的加速器,等等.除此以外,S ...
- 【一】gym环境安装以及安装遇到的错误解决
相关文章: [一]gym环境安装以及安装遇到的错误解决 [二]gym初次入门一学就会-简明教程 [三]gym简单画图 [四]gym搭建自己的环境,全网最详细版本,3分钟你就学会了! [五]gym搭建自 ...
- C/C++ 通用ShellCode的编写与调用
首先,我们的ShellCode代码需要自定位,因为我们的代码并不是一个完整的EXE可执行程序,他没有导入表无法定位到当前系统中每个函数的虚拟地址,所以我们直接获取到Kernel32.dll的基地址,里 ...