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

jdk17+springboot使用webservice,踩坑记录

这几天wms对接lbpm系统,给我的接口是webservice的,老实说,这个技术很早,奈何人家只支持这个。
环境说明:JDK17 springboot2.6.6。网上很多教程是基于jdk8的,所以很多在17上面跑不起来。折腾两天,直接给答案。
因为springboot版本不是3.0,用不了cxf-spring-boot-starter-jaxws4版本,会各种稀奇报错,或许是我姿势不对,就没继续折腾了。如果你是springboot3,请用4版本

动态代理调用的时候需要一个参数一个参数排列传,不是一个对象。

  1. 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>
  1. properties配置
#这个是webservice访问的路径
#http://localhost:8899/webservice?wsdl
cxf.path=/webservice
cxf.servlet.enabled=true
cxf.servlet.init.services-list-path=webservice
  1. 配置文件

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;}
}
  1. 服务端写法
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);}
}
  1. 客户端写法,用动态代理的方式,不然类太多了
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系统&#xff0c;给我的接口是webservice的&#xff0c;老实说&#xff0c;这个技术很早&#xff0c;奈何人家只支持这个。 环境说明&#xff1a;JDK17 springboot2.6.6。网上很多教程是基于jdk8的&#xff0c;所以很多在17上面跑不起来。折腾两天&#xff0c…...

计算机网络文件拆分—视频流加载、断点续传

视频流加载 视频流加载的原理是通过网络传输和播放器解码来实现的。 首先&#xff0c;视频文件会被分成一系列小的数据包&#xff0c;通常是以流的形式传输&#xff0c;这些数据包通过网络传输到用户设备。在传输过程中&#xff0c;可以采用各种协议&#xff0c;如HTTP、RTSP…...

JVM 给对象分配内存空间

指针碰撞空闲列表TLAB 为对象分配空间的任务实际上便等同于把一块确定大小的内存块从Java堆中划分出来。 指针碰撞&#xff1a;&#xff08;Bump The Pointer&#xff09; 堆的内存是绝对规整的&#xff0c;内存主要分为两部分&#xff0c;所有使用过的内存被放在一边&#x…...

Excel·VBA二维数组组合函数、组合求和

目录 1&#xff0c;二维数组组合函数举例 2&#xff0c;组合求和 之前的文章《ExcelVBA数组组合函数、组合求和》和《ExcelVBA数组排列函数》&#xff0c;都是针对一维数组的组合和排列 二维数组组合&#xff1a;对一个m行*n列的二维数组&#xff0c;每行抽取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的个数

编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 1 的个数&#xff08;也被称为汉明重量&#xff09;。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;如 Java&#xff09;中…...

安防监控视频平台EasyCVR视频汇聚平台调用接口出现跨域现象的问题解决方案

视频监控汇聚EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视…...

Python中的一些常用操作

文章目录 一. Python操作之-- 使用Python 提取PDF文件中的表格数据&#xff01;二&#xff1a;三&#xff1a; Python中的 staticmethodclassmethod方法四&#xff1a; 反斜杠 \五&#xff1a; 终端的解释器提示符号修改六&#xff1a; python使用json.dumps输出中文七&#xf…...

go语言调用python脚本

文章目录 代码gopython 在 go语言中调用 python 程序&#xff0c;你可能会用到 代码 亲测 go 测试 go 文件 func TestR(t *testing.T) {// 设置要执行的Python脚本和参数scriptPath : "../nansen.py"arg1 : "nansen"// 执行Python脚本cmd : exec.Comm…...

2.3 【MySQL】命令行和配置文件中启动选项的区别

在命令行上指定的绝大部分启动选项都可以放到配置文件中&#xff0c;但是有一些选项是专门为命令行设计的&#xff0c;比方说defaults-extra-file 、 defaults-file 这样的选项本身就是为了指定配置文件路径的&#xff0c;再放在配置文件中使用就没啥意义了。 如果同一个启动选…...

外部库/lib/maven依赖项 三者关系

外部库(存放项目初始配置的jar包)(它的文件夹里并没有包含lib文件夹的引的外部的依赖的jar包) lib(存放外部导入到项目的依赖的jar包) maven依赖项(管理项目所有的jar包依赖) 三者存放jar包的关系 项目所依赖的全部的jar包 maven依赖项的jar包 外部库中的jar包 lib中的…...

在线制作作息时间表

时光荏苒&#xff0c;岁月如梭&#xff0c;人们描述时光易逝的句子&#xff0c;多如星河。 一寸光阴一寸金&#xff0c;寸金难买寸光阴。 人生就是一段时间而已&#xff0c;所以我明白了一个道理 人生之中最大的浪费就是时间的浪费 因此我想我们教给我们孩子重要的一课应该也是…...

他们朝我扔泥巴(scratch)

前言 纯~~~属~~~虚~~~构~~~&#xff08;同学看完短视频要我做&#xff0c;蟹蟹你&#xff09; 用scratch做的&#xff0c;幼稚得嘞(&#xffe3;_&#xffe3;|||)呵呵&#xff08;强颜欢笑&#xff09; 完成视频 视频试了好久&#xff0c;就是传不上来&#xff0c;私信我加我…...

docker部署前端项目保姆级教程

本地启动docker&#xff08;有不会启动的吗&#xff1f;下载docker&#xff08;小海豚&#xff09;双击起来就行&#xff09; 准备阿里云账号&#xff08;免费&#xff09; 没有就去注册一个&#xff0c;记住密码后面要用到 官网地址&#xff1a;阿里云登录 - 欢迎登录阿里云…...

《C和指针》笔记13: static关键字总结

这里对static关键字做一下总结&#xff0c;可以回顾一下前面两篇博客的文章。 《C和指针》笔记11: external和internal链接属性 《C和指针》笔记12: 存储类型&#xff08;自动变量、静态变量和寄存器变量&#xff09; 当它用于函数定义时&#xff0c;或用于代码块之外的变量声…...

Docker harbor私有仓库部署与管理

一、搭建本地私有仓库二、Harbor私有仓库部署与管理1、Harbor概述2、Harbor的特性3、Harbor的核心组件3.1 Proxy3.2 Registry3.3 Core services3.3.1 UI&#xff08;harbor-ui&#xff09;3.3.2 WebHook3.3.3 Token 服务 3.4 Database&#xff08;harbor-db&#xff09;3.5 Log…...

解锁Selenium的力量:不仅仅是Web测试

Selenium简介 Selenium&#xff0c;作为Web应用测试的领军者&#xff0c;已经成为了无数开发者和测试人员的首选工具。它不仅仅是一个自动化测试工具&#xff0c;更是一个强大的Web应用交互框架。 Selenium的起源与发展 Selenium的历史可以追溯到2004年&#xff0c;由Jason Hu…...

[SQLITE_ERROR] SQL error or missing database (near “=“: syntax error)【已解决】

这个报的错误是语法错误&#xff0c;但是我并没有看出来这行代码有什么错。 通过排除掉下边两个问题解决的 从增加记录方法复制的下来的代码&#xff0c;只删除了关闭自动提交事务&#xff0c;但是connection.commit忘记删除executeQuery和executeUpdate方法的用法忘记了&…...

【视觉系统】笔芯内径机器视觉测量软硬件方案-康耐德智能

检测内容 笔芯内径机器视觉测量系统 检测要求 精度0.03mm&#xff0c;速度120~180个/分钟 视觉可行性分析 对样品进行了光学实验&#xff0c;并进行图像处理&#xff0c;原则上可以使用机器视觉系统进行测试测量。 结果&#xff1a; 对所有样品进行分析&#xff0c;可以在不…...

将文件夹的名称写到Excel中

查看文件夹名称 os.listdir()函数会返回指定路径下的所有文件和文件夹的名称列表&#xff0c;包括隐藏文件和文件夹 import osfolder_path . # 文件夹路径 # . is当前路径 files os.listdir(folder_path) # 获取文件夹内所有文件的名称列表for filename in files:print(fi…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

日语学习-日语知识点小记-构建基础-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过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;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 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

零基础设计模式——行为型模式 - 责任链模式

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

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;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 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...