jdk17+springboot使用webservice,踩坑记录
时间:2024-04-24 09:35:19 来源:网络cs 作者:亙句 栏目:监控软件 阅读:
这几天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?wsdlcxf.path=/webservicecxf.servlet.enabled=truecxf.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;@Configurationpublic class WebServiceConfig { @Autowired private Bus bus; @Bean public 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); @Resource private 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;@Configurationpublic 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接口地址创建client Client 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 客户端 */@Servicepublic 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>
本文链接:https://www.kjpai.cn/news/2024-04-24/161689.html,文章来源:网络cs,作者:亙句,版权归作者所有,如需转载请注明来源和作者,否则将追究法律责任!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
下一篇:返回列表