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…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...