最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

jdk17+springboot使用webservice的踩坑實(shí)戰(zhàn)記錄

 更新時(shí)間:2024年01月31日 09:39:52   作者:未兆  
這篇文章主要給大家介紹了關(guān)于jdk17+springboot使用webservice踩坑的相關(guān)資料,網(wǎng)上很多教程是基于jdk8的,所以很多在17上面跑不起來(lái),折騰兩天,直接給答案,需要的朋友可以參考下

這幾天wms對(duì)接lbpm系統(tǒng),給我的接口是webservice的,老實(shí)說(shuō),這個(gè)技術(shù)很早,奈何人家只支持這個(gè)。

環(huán)境說(shuō)明:JDK17 springboot2.6.6。網(wǎng)上很多教程是基于jdk8的,所以很多在17上面跑不起來(lái)。折騰兩天,直接給答案。

因?yàn)閟pringboot版本不是3.0,用不了cxf-spring-boot-starter-jaxws 的4版本,會(huì)各種稀奇報(bào)錯(cuò),或許是我姿勢(shì)不對(duì),就沒(méi)繼續(xù)折騰了。

如果你是springboot3,請(qǐng)用4版本

動(dòng)態(tài)代理調(diào)用的時(shí)候需要一個(gè)參數(shù)一個(gè)參數(shù)排列傳,不是一個(gè)對(duì)象。

  • pom文件需要引入,版本按照這個(gè),測(cè)試通過(guò)的版本。
<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配置
#這個(gè)是webservice訪問(wèn)的路徑
#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 {

    @Autowired
    private Bus bus;

    @Bean
    public EndpointImpl endpoint() {
        EndpointImpl endpoint = new EndpointImpl(bus, new WebService());
        endpoint.publish("/api");
        return endpoint;
    }
}
  • 服務(wù)端寫(xiě)法
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調(diào)用
 * 將接口信息注冊(cè)到接口平臺(tái)上,soap接口調(diào)用接口平臺(tái)配置實(shí)現(xiàn)透?jìng)?
 */
@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;

    /**
     * 獲取指定異構(gòu)系統(tǒng)的表單模板集合
     *
     * @param sysId    異構(gòu)系統(tǒng)標(biāo)識(shí),此為異構(gòu)系統(tǒng)配置中的唯一標(biāo)識(shí)(sysId)
     * @param language 語(yǔ)種,默認(rèn)為空,即中文
     * @return 表單模板集合。返回值示例;[{"systemId":"系統(tǒng)標(biāo)識(shí)","modelId":"模塊標(biāo)識(shí)","modelName":
     * "模塊名稱(chēng)"
     * ,"templateFormId":"表單模板標(biāo)識(shí)","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);
    }

    /**
     * 獲取指定異構(gòu)系統(tǒng)的指定模塊,指定表單模板的字段元數(shù)據(jù)描述集合
     *
     * @param sysId          異構(gòu)系統(tǒng)標(biāo)識(shí),此為異構(gòu)系統(tǒng)配置中的唯一標(biāo)識(shí)(sysId)
     * @param modelId        異構(gòu)系統(tǒng)模塊ID
     * @param templateFormId 異構(gòu)系統(tǒng)表單模板ID
     * @param language       語(yǔ)種,默認(rèn)為空,即中文
     * @return 字段元數(shù)據(jù)描述集合。返回值示例:[{"fieldId":"字段ID","fieldName":"字段名","type":"字段類(lèi)型"
     * }]
     */
    @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);
    }

    /**
     * 查詢(xún)流程事件調(diào)用的業(yè)務(wù)函數(shù)信息
     *
     * @param sysId          異構(gòu)系統(tǒng)標(biāo)識(shí),此為異構(gòu)系統(tǒng)配置中的唯一標(biāo)識(shí)(sysId)
     * @param modelId        異構(gòu)系統(tǒng)模塊ID
     * @param templateFormId 異構(gòu)系統(tǒng)表單模板ID
     * @param language       語(yǔ)種,默認(rèn)為空,即中文
     * @return 業(yè)務(wù)函數(shù)信息集。返回值示例:[{{"functionId":"函數(shù)標(biāo)識(shí)","functionName":"函數(shù)標(biāo)識(shí)","functionDes"
     * :"函數(shù)描述"}]
     */
    @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);
    }

    /**
     * 獲取異構(gòu)系統(tǒng)指定表單實(shí)例的指定字段的值
     *
     * @param sysId          異構(gòu)系統(tǒng)標(biāo)識(shí),此為異構(gòu)系統(tǒng)配置中的唯一標(biāo)識(shí)(fdCode)
     * @param modelId        異構(gòu)系統(tǒng)模塊ID
     * @param templateFormId 異構(gòu)系統(tǒng)表單模板ID
     * @param formInstanceId 異構(gòu)系統(tǒng)表單實(shí)例ID
     * @param fieldIds       表單字段ID集,多值以逗號(hào)分隔
     * @param language       語(yǔ)種,默認(rèn)為空,即中文
     * @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);
    }

    /**
     * 執(zhí)行指定函數(shù)的業(yè)務(wù)邏輯
     *
     * @param formId      異構(gòu)系統(tǒng)表單信息。格式:{"sysId":"異構(gòu)系統(tǒng)標(biāo)識(shí)","modelId":"模塊ID",
     *                    "templateFormId":"表單模板ID", "formInstanceId":"表單實(shí)例ID"}
     * @param functionId  函數(shù)ID
     * @param processData 流程運(yùn)行時(shí)信息。格式暫定。
     * @param language    語(yǔ)種,默認(rèn)為空,即中文
     * @return 是否執(zhí)行成功。返回值示例:"T" 或 "F:錯(cuò)誤信息"
     */
    @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);
    }
}
  • 客戶(hù)端寫(xiě)法,用動(dòng)態(tài)代理的方式,不然類(lèi)太多了
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() {
        // 創(chuàng)建動(dòng)態(tài)客戶(hù)端
        JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();
        //根據(jù)WebServices接口地址創(chuàng)建client
        Client client = clientFactory.createClient(wsdlUrl);
        HTTPConduit conduit = (HTTPConduit) client.getConduit();
        HTTPClientPolicy policy = new HTTPClientPolicy();
        policy.setAllowChunking(false);
        // 連接服務(wù)器超時(shí)時(shí)間 10秒
        policy.setConnectionTimeout(10000);
        // 等待服務(wù)器響應(yīng)超時(shí)時(shí)間 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;

/**
 * 調(diào)用bpm 客戶(hù)端
 */
@Service
public class WebClientImpl {
    private final static Logger log = LoggerFactory.getLogger(WsClientConfig.class);
    //注入
    @Autowired(required = false)
    @Qualifier("LbpmWsClient")
    private Client client;

    /**
     * 統(tǒng)一處理方法
     */
    public String handler(String method, Object... obj) {
        try {
            //invoke(接口中的方法名稱(chēng),方法的參數(shù))
            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調(diào)用異常:" + e.getMessage());
        }
        return null;
    }

    /**
     * 處理響應(yīng)報(bào)文
     */
    public String handlerBody(Object[] objects) {
        return JsonUtil.toJSONString(objects);
    }

    /**
     * test
     */
    public String test(String qq) {
        return handler("qqCheckOnline", qq);
    }

    /**
     * 創(chuàng)建
     */
    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()
        );
    }

    /**
     * 當(dāng)前節(jié)點(diǎn)的信息
     */
    public String getCurrentNodesInfo(GetCurrentNodesInfo getCurrentNodesInfo) {
        return handler("GetCurrentNodesInfo",
                getCurrentNodesInfo.getFormId(),
                getCurrentNodesInfo.getProcessId(),
                getCurrentNodesInfo.getLanguage()
        );
    }

    /**
     * 當(dāng)前用戶(hù)操作集
     */
    public String getOperationList(GetOperationList getOperationList) {
        return handler("GetOperationList",
                getOperationList.getFormId(),
                getOperationList.getProcessId(),
                getOperationList.getActionUid(),
                getOperationList.getLanguage()
        );
    }

    /**
     * 當(dāng)前處理人列表
     */
    public String getApproverList(GetApproverList getApproverList) {
        return handler("GetApproverList",
                getApproverList.getFormId(),
                getApproverList.getProcessId(),
                getApproverList.getLanguage()
        );
    }
}

錯(cuò)誤提示:

Caused by: java.lang.ClassNotFoundException: com/sun/tools/internal/xjc/api/XJC

這個(gè)需要引入jaxb-xjc。如果這個(gè)版本不行,多試驗(yàn)幾個(gè),jdk8以后,就需要這個(gè),jdk17我用這個(gè)好了,不行多試驗(yàn)幾個(gè)版本?。?!

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

總結(jié) 

到此這篇關(guān)于jdk17+springboot使用webservice踩坑的文章就介紹到這了,更多相關(guān)jdk17 springboot使用webservice內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java Chassis3過(guò)載狀態(tài)下的快速失敗解決分析

    Java Chassis3過(guò)載狀態(tài)下的快速失敗解決分析

    本文解密了Java Chassis 3快速失敗相關(guān)的機(jī)制和背后故事,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • IDEA如何實(shí)現(xiàn)查看UML類(lèi)圖

    IDEA如何實(shí)現(xiàn)查看UML類(lèi)圖

    這篇文章主要介紹了IDEA如何實(shí)現(xiàn)查看UML類(lèi)圖問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • 關(guān)于SpringCloud灰度發(fā)布的實(shí)現(xiàn)

    關(guān)于SpringCloud灰度發(fā)布的實(shí)現(xiàn)

    這篇文章主要介紹了關(guān)于SpringCloud灰度發(fā)布的實(shí)現(xiàn),灰度發(fā)布又稱(chēng)金絲雀發(fā)布,是在系統(tǒng)升級(jí)的時(shí)候能夠平滑過(guò)渡的一種發(fā)布方式,灰度發(fā)布可以保證整體系統(tǒng)的穩(wěn)定,在初始灰度的時(shí)候就可以發(fā)現(xiàn)、調(diào)整問(wèn)題,以保證其影響度,需要的朋友可以參考下
    2023-08-08
  • Java實(shí)現(xiàn)赫夫曼樹(shù)(哈夫曼樹(shù))的創(chuàng)建

    Java實(shí)現(xiàn)赫夫曼樹(shù)(哈夫曼樹(shù))的創(chuàng)建

    給定N個(gè)權(quán)值作為N個(gè)葉子結(jié)點(diǎn),構(gòu)造一棵二叉樹(shù),若該樹(shù)的帶權(quán)路徑長(zhǎng)度(WPL)達(dá)到最小,稱(chēng)這樣的二叉樹(shù)為最優(yōu)二叉樹(shù),也稱(chēng)為哈夫曼樹(shù)(Huffman Tree)。這篇文章主要就是為大家介紹如何通過(guò)Java實(shí)現(xiàn)赫夫曼樹(shù),需要的朋友可以參考一下
    2021-12-12
  • JDBC自定義連接池過(guò)程詳解

    JDBC自定義連接池過(guò)程詳解

    這篇文章主要介紹了JDBC自定義連接池過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 淺談Java向下轉(zhuǎn)型的意義

    淺談Java向下轉(zhuǎn)型的意義

    這篇文章主要介紹了淺談Java向下轉(zhuǎn)型的意義,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • java.io.EOFException: Unexpected end of ZLIB input stream異常解決

    java.io.EOFException: Unexpected end of 

    本文主要介紹了java.io.EOFException: Unexpected end of ZLIB input stream異常解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 聊聊Java 成員變量賦值和構(gòu)造方法誰(shuí)先執(zhí)行的問(wèn)題

    聊聊Java 成員變量賦值和構(gòu)造方法誰(shuí)先執(zhí)行的問(wèn)題

    這篇文章主要介紹了聊聊Java 成員變量賦值和構(gòu)造方法誰(shuí)先執(zhí)行的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • 在Java中實(shí)現(xiàn)線程之間的數(shù)據(jù)共享的幾種方式總結(jié)

    在Java中實(shí)現(xiàn)線程之間的數(shù)據(jù)共享的幾種方式總結(jié)

    在 Java 中實(shí)現(xiàn)線程間數(shù)據(jù)共享是并發(fā)編程的核心需求,但需要謹(jǐn)慎處理同步問(wèn)題以避免競(jìng)態(tài)條件,本文通過(guò)代碼示例給大家介紹了幾種主要實(shí)現(xiàn)方式及其最佳實(shí)踐,需要的朋友可以參考下
    2025-08-08
  • 詳解IDEA下Gradle多模塊(項(xiàng)目)的構(gòu)建

    詳解IDEA下Gradle多模塊(項(xiàng)目)的構(gòu)建

    這篇文章主要介紹了詳解IDEA下Gradle多模塊(項(xiàng)目)的構(gòu)建,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01

最新評(píng)論

峨边| 绥芬河市| 滦平县| 高碑店市| 鹤岗市| 舟山市| 澄城县| 大邑县| 贵阳市| 南皮县| 绥宁县| 布尔津县| 四川省| 利川市| 沙湾县| 正定县| 汝州市| 英超| 和龙市| 始兴县| 周至县| 武汉市| 新巴尔虎右旗| 乃东县| 金湖县| 大埔县| 开江县| 银川市| 辽阳县| 宁武县| 抚宁县| 尚义县| 平安县| 榆社县| 黑龙江省| 德清县| 惠安县| 余干县| 开阳县| 兴宁市| 会昌县|