jdk17+springboot使用webservice,踩坑记录

这篇具有很好参考价值的文章主要介绍了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 {

    @Autowired
    private Bus bus;

    @Bean
    public 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);

    @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);
    }
}

  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接口地址创建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 客户端
 */
@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我用这个好了,不行多试验几个版本!!!文章来源地址https://www.toymoban.com/news/detail-787175.html

		<dependency>
			<groupId>com.sun.xml.bind</groupId>
			<artifactId>jaxb-xjc</artifactId>
			<version>2.3.8</version>
		</dependency>

到了这里,关于jdk17+springboot使用webservice,踩坑记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot 整合WebService详解

    WebService服务端是以远程接口为主的,在Java实现的WebService技术里主要依靠CXF开发框架,而这个CXF开发框架可以直接将接口发布成WebService。 CXF又分为JAX-WS和JAX-RS,JAX-WS是基于xml协议,而JAX-RS是基于Restful风格,两者的区别如下: RS基于Restful风格,WS基于SOAP的XML协议 RS比WS传输的

    2024年02月04日
    浏览(26)
  • springboot调用webservice简便方式

    此方法不建议在需要 高并发 或者是 批量调用 webservice接口时使用,比较吃内存。仅在管理系统后台中,或者是用户量少时可以采用此取巧方案。 直接上核心代码:

    2024年02月14日
    浏览(20)
  • SpringBoot项目添加WebService服务

    1.简单描述 WebService简单理解就是用http发送接收xml数据,但这个xml得遵守系统的规范。这个规范就是WSDL(Web服务描述语言,Web Services Description Language)。 在WebService中传输的xml有一个正式的名称叫Soap(简单对象访问协议 Simple Object Access Protocol)。 WebService分为客户端和服务端

    2024年02月16日
    浏览(33)
  • [webservice] springboot整合cxf

    2.1 pom.xml 中添加依赖 springboot整合Apache cxf 2.3 service发布(cxf配置) 发布完成后启动web服务,可以通过: http://127.0.0.1:8080/ws 访问已经发布的服务。 在这里分享一个天气预报的webservice服务: http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl 3.1 使用wsdl2java生成webservice客户端代码

    2024年04月25日
    浏览(21)
  • WebService工具类(SpringBoot环境调用)

    以下工具集成了多种方式调用webservice,如http方式,axis方式,动态生成客户端方式等 ,是为笔者实际工作中提炼的,方便大家直接套用,常用方法都有调用示列。 一、整个工具类代码 二、pom依赖引入 可能有复制多了的依赖,可自己尝试去除,工具类不飘红报错就行 三、方

    2024年02月04日
    浏览(25)
  • 基于SpringBoot 的SOAP WebService实现(二)

    成功启动springboot应用后,使用postman新建POST请求,地址: http://localhost:8080/soap/userManagement  正文body选择raw,XML格式。 headers填入如下键值对:  其中xlms字段是 WSDL中的namespace字段。   发送请求,返回了一个User类 。 至此,webservice SOAP服务发布测试成功。 新建客户端模块,m

    2024年02月09日
    浏览(31)
  • 【Java】利用SpringBoot搭建WebService服务接口

    在项目开发过程中经常会碰到对接医疗软件系统的时候对方要求提供WebService形式的接口,本篇文章记载了个人对接项目过程中整合并搭建的WebService形式的接口,希望对您能够有所帮助! 代码如下: 代码如下(示例): 代码如下(示例): 提示:其中的@WebParam(name=\\\"ROOT\\\")

    2024年02月05日
    浏览(33)
  • 【WebService】使用postman调用WebService方法

    公司原来有一个项目使用的是WebService,想模拟一下怎么调用WebService的方法,使用postman调用怎么调用。 接口:http://127.0.0.1:8080/SecurityWebService/SecurityCommand?wsdl 对应你的代码配置: 注意:Content-Type:text/xml;charset=UTF-8 默认的要注释 接下来解析一下请求xml xmlns:test: 不能少,必须是

    2024年02月08日
    浏览(40)
  • 使用axis调用WebService,Java WebService调用工具类

    概述 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件,就可相互交换数据或集成。依据 WebService 规范实施的应用之间,无论它们所使用的语言、平台或内部协议是什么,都可以相互交换数据。 也就是说可以实现多语言、跨平台数据交互。 引入

    2024年01月17日
    浏览(31)
  • springboot实现webservice接口自定义返回值通过postman测试

    震惊~~都2023年了竟然还有人用webservice! maven添加依赖 添加配置文件 自定义拦截器 通过cxf实现wenservice服务返回结果是有一层固定包装的,类似下图,return标签里才是结果,如何完全自定义返回的结果数据呢?就需要上面的拦截器去掉外层的包装。 service类 实现类 接下来启动

    2024年02月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包