jdk17+springboot使用webservice,踩坑记录
这几天wms对接lbpm系统,给我的接口是webservice的,老实说,这个技术很早,奈何人家只支持这个。
 环境说明:JDK17 springboot2.6.6。网上很多教程是基于jdk8的,所以很多在17上面跑不起来。折腾两天,直接给答案。
 因为springboot版本不是3.0,用不了cxf-spring-boot-starter-jaxws 的4版本,会各种稀奇报错,或许是我姿势不对,就没继续折腾了。如果你是springboot3,请用4版本
动态代理调用的时候需要一个参数一个参数排列传,不是一个对象。
- pom文件需要引入,版本按照这个,测试通过的版本。
 
<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.5.6</version></dependency><dependency><groupId>com.sun.xml.bind</groupId><artifactId>jaxb-xjc</artifactId><version>2.3.8</version></dependency>
 
- properties配置
 
#这个是webservice访问的路径
#http://localhost:8899/webservice?wsdl
cxf.path=/webservice
cxf.servlet.enabled=true
cxf.servlet.init.services-list-path=webservice
 
- 配置文件
 
import org.apache.cxf.Bus;
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;@Configuration
public class WebServiceConfig {@Autowiredprivate Bus bus;@Beanpublic EndpointImpl endpoint() {EndpointImpl endpoint = new EndpointImpl(bus, new WebService());endpoint.publish("/api");return endpoint;}
} 
- 服务端写法
 
package com.zxy.mom.product.wms2.web.bpm;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import java.util.HashMap;
import java.util.Map;/*** LBPM webservice调用* 将接口信息注册到接口平台上,soap接口调用接口平台配置实现透传*/
@Component
@javax.jws.WebService(serviceName = "WebService", targetNamespace = "http://product.mom.zxy.com/")
public class WebService {private final static Logger logger = LoggerFactory.getLogger(WebService.class);@Resourceprivate ProjectServiceImp projectServiceImp;/*** 获取指定异构系统的表单模板集合** @param sysId    异构系统标识,此为异构系统配置中的唯一标识(sysId)* @param language 语种,默认为空,即中文* @return 表单模板集合。返回值示例;[{"systemId":"系统标识","modelId":"模块标识","modelName":* "模块名称"* ,"templateFormId":"表单模板标识","templateFormName":"表单模板名","formUrl"* :"表单Url"}]*/@WebMethod(operationName = "getTemplateFormList")@WebResult(targetNamespace = "http://product.mom.zxy.com/")public String getTemplateFormList(@WebParam(name = "sysId", targetNamespace = "") String sysId,@WebParam(name = "language", targetNamespace = "") String language) {Map<String, String> paramMap = new HashMap<>(2);paramMap.put("sysId", sysId);paramMap.put("language", language);return projectServiceImp.getTemplateFormList(sysId, language);}/*** 获取指定异构系统的指定模块,指定表单模板的字段元数据描述集合** @param sysId          异构系统标识,此为异构系统配置中的唯一标识(sysId)* @param modelId        异构系统模块ID* @param templateFormId 异构系统表单模板ID* @param language       语种,默认为空,即中文* @return 字段元数据描述集合。返回值示例:[{"fieldId":"字段ID","fieldName":"字段名","type":"字段类型"* }]*/@WebMethod(operationName = "getFormFieldList")@WebResult(targetNamespace = "http://product.mom.zxy.com/")public String getFormFieldList(@WebParam(name = "sysId") String sysId,@WebParam(name = "modelId") String modelId,@WebParam(name = "templateFormId") String templateFormId,@WebParam(name = "language") String language) {Map<String, String> paramMap = new HashMap<>(4);paramMap.put("sysId", sysId);paramMap.put("modelId", modelId);paramMap.put("templateFormId", templateFormId);paramMap.put("language", language);return projectServiceImp.getFormFieldList(sysId, modelId, templateFormId, language);}/*** 查询流程事件调用的业务函数信息** @param sysId          异构系统标识,此为异构系统配置中的唯一标识(sysId)* @param modelId        异构系统模块ID* @param templateFormId 异构系统表单模板ID* @param language       语种,默认为空,即中文* @return 业务函数信息集。返回值示例:[{{"functionId":"函数标识","functionName":"函数标识","functionDes"* :"函数描述"}]*/@WebMethod(operationName = "getMethodInfo")@WebResult(targetNamespace = "http://product.mom.zxy.com/")public String getMethodInfo(@WebParam(name = "sysId") String sysId,@WebParam(name = "modelId") String modelId,@WebParam(name = "templateFormId") String templateFormId,@WebParam(name = "language") String language) {Map<String, String> paramMap = new HashMap<>(4);paramMap.put("sysId", sysId);paramMap.put("modelId", modelId);paramMap.put("templateFormId", templateFormId);paramMap.put("language", language);return projectServiceImp.getMethodInfo(sysId, modelId, templateFormId, language);}/*** 获取异构系统指定表单实例的指定字段的值** @param sysId          异构系统标识,此为异构系统配置中的唯一标识(fdCode)* @param modelId        异构系统模块ID* @param templateFormId 异构系统表单模板ID* @param formInstanceId 异构系统表单实例ID* @param fieldIds       表单字段ID集,多值以逗号分隔* @param language       语种,默认为空,即中文* @return 指定字段的值集合。返回值示例:[{"fieldId":"字段ID","fieldValue":"字段值"}]*/@WebMethod(operationName = "getFormFieldValueList")@WebResult(targetNamespace = "http://product.mom.zxy.com/")public String getFormFieldValueList(@WebParam(name = "sysId") String sysId,@WebParam(name = "modelId") String modelId,@WebParam(name = "templateFormId") String templateFormId,@WebParam(name = "formInstanceId") String formInstanceId,@WebParam(name = "fieldIds") String fieldIds,@WebParam(name = "language") String language) {Map<String, String> paramMap = new HashMap<>(6);paramMap.put("sysId", sysId);paramMap.put("modelId", modelId);paramMap.put("templateFormId", templateFormId);paramMap.put("formInstanceId", formInstanceId);paramMap.put("fieldIds", fieldIds);paramMap.put("language", language);return projectServiceImp.getFormFieldValueList(sysId, modelId, templateFormId, formInstanceId, fieldIds, language);}/*** 执行指定函数的业务逻辑** @param formId      异构系统表单信息。格式:{"sysId":"异构系统标识","modelId":"模块ID",*                    "templateFormId":"表单模板ID", "formInstanceId":"表单实例ID"}* @param functionId  函数ID* @param processData 流程运行时信息。格式暂定。* @param language    语种,默认为空,即中文* @return 是否执行成功。返回值示例:"T" 或 "F:错误信息"*/@WebMethod(operationName = "doMethodProcess")@WebResult(targetNamespace = "http://product.mom.zxy.com/")public String doMethodProcess(@WebParam(name = "formId") String formId,@WebParam(name = "functionId") String functionId,@WebParam(name = "processData") String processData,@WebParam(name = "language") String language) {Map<String, String> paramMap = new HashMap<>(4);paramMap.put("formId", formId);paramMap.put("functionId", functionId);paramMap.put("processData", processData);paramMap.put("language", language);return projectServiceImp.doMethodProcess(formId, functionId, processData, language);}
} 
- 客户端写法,用动态代理的方式,不然类太多了
 
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class WsClientConfig {private final static Logger logger = LoggerFactory.getLogger(WsClientConfig.class);@Value("${wms.bpmUrl:http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl}")private String wsdlUrl;@Bean("LbpmWsClient")public Client client() {// 创建动态客户端JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();//根据WebServices接口地址创建clientClient client = clientFactory.createClient(wsdlUrl);HTTPConduit conduit = (HTTPConduit) client.getConduit();HTTPClientPolicy policy = new HTTPClientPolicy();policy.setAllowChunking(false);// 连接服务器超时时间 10秒policy.setConnectionTimeout(10000);// 等待服务器响应超时时间 20秒policy.setReceiveTimeout(20000);conduit.setClient(policy);return client;}
} 
import com.zxy.mom.product.wms2.web.bpm.entity.*;
import com.zxy.mom.sdk.common.exception.ConditionException;
import com.zxy.mom.sdk.common.util.JsonUtil;
import org.apache.cxf.endpoint.Client;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;/*** 调用bpm 客户端*/
@Service
public class WebClientImpl {private final static Logger log = LoggerFactory.getLogger(WsClientConfig.class);//注入@Autowired(required = false)@Qualifier("LbpmWsClient")private Client client;/*** 统一处理方法*/public String handler(String method, Object... obj) {try {//invoke(接口中的方法名称,方法的参数)Object[] objects = client.invoke(method, obj);if (objects != null && objects.length > 0) {return handlerBody(objects);}} catch (Exception e) {log.error("抛出了异常:{}", e.getMessage());throw new ConditionException("webservice调用异常:" + e.getMessage());}return null;}/*** 处理响应报文*/public String handlerBody(Object[] objects) {return JsonUtil.toJSONString(objects);}/*** test*/public String test(String qq) {return handler("qqCheckOnline", qq);}/*** 创建*/public String createProcess(CreateProcess createProcess) {return handler("CreateProcess",createProcess.getFlowTemplateId(),createProcess.getFormId(),createProcess.getCreator(),createProcess.getExParam(),createProcess.getLanguage());}/*** 审批*/public String approveProcess(ApproveProcess approveProcess) {return handler("ApproveProcess",approveProcess.getFormId(),approveProcess.getProcessId(),approveProcess.getHandler(),approveProcess.getFormData(),approveProcess.getProcessParam(),approveProcess.getLanguage());}/*** 可审批*/public String canApprovalProcess(CanApprovalProcess canApprovalProcess) {return handler("CanApprovalProcess",canApprovalProcess.getFormId(),canApprovalProcess.getActionUid(),canApprovalProcess.getLanguage());}/*** 当前节点的信息*/public String getCurrentNodesInfo(GetCurrentNodesInfo getCurrentNodesInfo) {return handler("GetCurrentNodesInfo",getCurrentNodesInfo.getFormId(),getCurrentNodesInfo.getProcessId(),getCurrentNodesInfo.getLanguage());}/*** 当前用户操作集*/public String getOperationList(GetOperationList getOperationList) {return handler("GetOperationList",getOperationList.getFormId(),getOperationList.getProcessId(),getOperationList.getActionUid(),getOperationList.getLanguage());}/*** 当前处理人列表*/public String getApproverList(GetApproverList getApproverList) {return handler("GetApproverList",getApproverList.getFormId(),getApproverList.getProcessId(),getApproverList.getLanguage());}
} 
错误提示:
Caused by: java.lang.ClassNotFoundException: com/sun/tools/internal/xjc/api/XJC
 
这个需要引入jaxb-xjc。如果这个版本不行,多试验几个,jdk8以后,就需要这个,jdk17我用这个好了,不行多试验几个版本!!!
		<dependency><groupId>com.sun.xml.bind</groupId><artifactId>jaxb-xjc</artifactId><version>2.3.8</version></dependency>
相关文章:
jdk17+springboot使用webservice,踩坑记录
这几天wms对接lbpm系统,给我的接口是webservice的,老实说,这个技术很早,奈何人家只支持这个。 环境说明:JDK17 springboot2.6.6。网上很多教程是基于jdk8的,所以很多在17上面跑不起来。折腾两天,…...
计算机网络文件拆分—视频流加载、断点续传
视频流加载 视频流加载的原理是通过网络传输和播放器解码来实现的。 首先,视频文件会被分成一系列小的数据包,通常是以流的形式传输,这些数据包通过网络传输到用户设备。在传输过程中,可以采用各种协议,如HTTP、RTSP…...
JVM 给对象分配内存空间
指针碰撞空闲列表TLAB 为对象分配空间的任务实际上便等同于把一块确定大小的内存块从Java堆中划分出来。 指针碰撞:(Bump The Pointer) 堆的内存是绝对规整的,内存主要分为两部分,所有使用过的内存被放在一边&#x…...
Excel·VBA二维数组组合函数、组合求和
目录 1,二维数组组合函数举例 2,组合求和 之前的文章《ExcelVBA数组组合函数、组合求和》和《ExcelVBA数组排列函数》,都是针对一维数组的组合和排列 二维数组组合:对一个m行*n列的二维数组,每行抽取1个元素进行组合&a…...
调用自实现MyGetProcAddress获得CreateFileA函数并调用创建写入文件
写文件如下 #include <iostream> #include <Windows.h>typedef HANDLE(WINAPI* CreateFileAFunc)(LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE);DWORD MyGetProcAddress(_In_ HMODULE hModule,_In_ LPCSTR lpProcName ){PIMAGE_DOS_HEADE…...
Leetcode 191.位1的个数
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 1 的个数(也被称为汉明重量)。 提示: 请注意,在某些语言(如 Java)中…...
安防监控视频平台EasyCVR视频汇聚平台调用接口出现跨域现象的问题解决方案
视频监控汇聚EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等,能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视…...
Python中的一些常用操作
文章目录 一. Python操作之-- 使用Python 提取PDF文件中的表格数据!二:三: Python中的 staticmethodclassmethod方法四: 反斜杠 \五: 终端的解释器提示符号修改六: python使用json.dumps输出中文七…...
go语言调用python脚本
文章目录 代码gopython 在 go语言中调用 python 程序,你可能会用到 代码 亲测 go 测试 go 文件 func TestR(t *testing.T) {// 设置要执行的Python脚本和参数scriptPath : "../nansen.py"arg1 : "nansen"// 执行Python脚本cmd : exec.Comm…...
2.3 【MySQL】命令行和配置文件中启动选项的区别
在命令行上指定的绝大部分启动选项都可以放到配置文件中,但是有一些选项是专门为命令行设计的,比方说defaults-extra-file 、 defaults-file 这样的选项本身就是为了指定配置文件路径的,再放在配置文件中使用就没啥意义了。 如果同一个启动选…...
外部库/lib/maven依赖项 三者关系
外部库(存放项目初始配置的jar包)(它的文件夹里并没有包含lib文件夹的引的外部的依赖的jar包) lib(存放外部导入到项目的依赖的jar包) maven依赖项(管理项目所有的jar包依赖) 三者存放jar包的关系 项目所依赖的全部的jar包 maven依赖项的jar包 外部库中的jar包 lib中的…...
在线制作作息时间表
时光荏苒,岁月如梭,人们描述时光易逝的句子,多如星河。 一寸光阴一寸金,寸金难买寸光阴。 人生就是一段时间而已,所以我明白了一个道理 人生之中最大的浪费就是时间的浪费 因此我想我们教给我们孩子重要的一课应该也是…...
他们朝我扔泥巴(scratch)
前言 纯~~~属~~~虚~~~构~~~(同学看完短视频要我做,蟹蟹你) 用scratch做的,幼稚得嘞( ̄_ ̄|||)呵呵(强颜欢笑) 完成视频 视频试了好久,就是传不上来,私信我加我…...
docker部署前端项目保姆级教程
本地启动docker(有不会启动的吗?下载docker(小海豚)双击起来就行) 准备阿里云账号(免费) 没有就去注册一个,记住密码后面要用到 官网地址:阿里云登录 - 欢迎登录阿里云…...
《C和指针》笔记13: static关键字总结
这里对static关键字做一下总结,可以回顾一下前面两篇博客的文章。 《C和指针》笔记11: external和internal链接属性 《C和指针》笔记12: 存储类型(自动变量、静态变量和寄存器变量) 当它用于函数定义时,或用于代码块之外的变量声…...
Docker harbor私有仓库部署与管理
一、搭建本地私有仓库二、Harbor私有仓库部署与管理1、Harbor概述2、Harbor的特性3、Harbor的核心组件3.1 Proxy3.2 Registry3.3 Core services3.3.1 UI(harbor-ui)3.3.2 WebHook3.3.3 Token 服务 3.4 Database(harbor-db)3.5 Log…...
解锁Selenium的力量:不仅仅是Web测试
Selenium简介 Selenium,作为Web应用测试的领军者,已经成为了无数开发者和测试人员的首选工具。它不仅仅是一个自动化测试工具,更是一个强大的Web应用交互框架。 Selenium的起源与发展 Selenium的历史可以追溯到2004年,由Jason Hu…...
[SQLITE_ERROR] SQL error or missing database (near “=“: syntax error)【已解决】
这个报的错误是语法错误,但是我并没有看出来这行代码有什么错。 通过排除掉下边两个问题解决的 从增加记录方法复制的下来的代码,只删除了关闭自动提交事务,但是connection.commit忘记删除executeQuery和executeUpdate方法的用法忘记了&…...
【视觉系统】笔芯内径机器视觉测量软硬件方案-康耐德智能
检测内容 笔芯内径机器视觉测量系统 检测要求 精度0.03mm,速度120~180个/分钟 视觉可行性分析 对样品进行了光学实验,并进行图像处理,原则上可以使用机器视觉系统进行测试测量。 结果: 对所有样品进行分析,可以在不…...
将文件夹的名称写到Excel中
查看文件夹名称 os.listdir()函数会返回指定路径下的所有文件和文件夹的名称列表,包括隐藏文件和文件夹 import osfolder_path . # 文件夹路径 # . is当前路径 files os.listdir(folder_path) # 获取文件夹内所有文件的名称列表for filename in files:print(fi…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
