sap接口開發與實現,Springboot整合SAPJCO采坑

 2023-12-10 阅读 31 评论 0

摘要:Springboot整合SAPJCO環境配置包管理創建連接代碼調用開發踩坑部署采坑 環境配置 參考: https://blog.csdn.net/tuohuang0303/article/details/83268914 JAVA_HOME=/usr/jdk1.8.0_271 PATH=PATH:PATH:PATH:{JAVA_HOME}/bin CLASSPATH=JAVAHOME/lib/dt.jar

Springboot整合SAPJCO

  • 環境配置
  • 包管理
  • 創建連接
  • 代碼調用
  • 開發踩坑
  • 部署采坑

環境配置

參考:
https://blog.csdn.net/tuohuang0303/article/details/83268914
JAVA_HOME=/usr/jdk1.8.0_271
PATH=PATH:PATH:PATH:{JAVA_HOME}/bin
CLASSPATH=JAVAHOME/lib/dt.jar:{JAVA_HOME}/lib/dt.jar:JAVAH?OME/lib/dt.jar:{JAVA_HOME}/lib/tools.jar:JAVAHOME/lib/sapjco3.jarJREHOME={JAVA_HOME}/lib/sapjco3.jar JRE_HOME=JAVAH?OME/lib/sapjco3.jarJREH?OME={JAVA_HOME}/jre
LD_LIBRARY_PATH=dir:LDLIBRARYPATH:LD_LIBRARY_PATH:LDL?IBRARYP?ATH:{JAVA_HOME}/jre/lib/amd64/server
export JAVA_HOME LD_LIBRARY_PATH PATH
linux下配置文件如上。

包管理

  • 將jar包手動丟到代碼資源目錄下,并配置pom.xml指向本地路徑,注意使用systemPath指向本地相對路徑注意使用systemPath指向相對路徑

創建連接

  • 使用自帶方法寫入本地配置文件,并讀取,創建connect,必須先創建文件,再讀取文件,十分不理解SAP的想法
private JCoDestination connect() {Properties connectProperties = new Properties();connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, JCO_ASHOST);connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, JCO_SYSNR);connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, JCO_CLIENT);connectProperties.setProperty(DestinationDataProvider.JCO_USER, JCO_USER);connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, JCO_PASSWD);connectProperties.setProperty(DestinationDataProvider.JCO_LANG, JCO_LANG);connectProperties.setProperty(DestinationDataProvider.JCO_POOL_CAPACITY, JCO_POOL_CAPACITY);connectProperties.setProperty(DestinationDataProvider.JCO_PEAK_LIMIT, JCO_PEAK_LIMIT);File cfg = new File(ABAP_AS_POOLED + ".jcoDestination");if (cfg.exists()) {cfg.deleteOnExit();}try {FileOutputStream fos = new FileOutputStream(cfg, false);connectProperties.store(fos, "for tests only !");fos.close();} catch (Exception e) {System.out.println("創建數據文件錯誤,錯誤消息:{}" + e.toString());throw new RuntimeException("無法創建目標文件: " + cfg.getName(), e);}JCoDestination destination = null;try {destination = JCoDestinationManager.getDestination(ABAP_AS_POOLED);} catch (Exception e) {e.printStackTrace();}return destination;}

代碼調用

try {JCoFunction function = null;JCoDestination destination = connect();function = destination.getRepository().getFunction("ZFM_WMS_023");JCoParameterList input = function.getImportParameterList();input.setValue("I_BUDAT", "2021-03-16");//input類型入參JCoStructure structure = input.getStructure("str1");structure.setValue("aaa","bbb");//結構體類入參JCoTable LT_TABLE = function.getTableParameterList().getTable("LT_TABLE");//表格寫數據,// 表格數據是雙向可讀寫的,即可以做入參,也可以做返回表單for (WhSubbox whSubbox :whSubboxes){LT_TABLE.appendRow();LT_TABLE.setValue("MATNR",whSubbox.getMatnr());LT_TABLE.setValue("CHARG",whSubbox.getCharg());                }function.execute(destination);      //執行接口System.out.println("function: {}"+function.toXML());  //萬能的toxml,方便查日志。JCoParameterList output = function.getExportParameterList();output.getString("TYPE");                                //讀取單個返回值output.getString("MESSAGE");                                //讀取單個返回值JCoTable BAPIRET2 = function.getTableParameterList().getTable("BAPIRET2");BAPIRET2.getString("aaa");//獲取第一行單個數據BAPIRET2.nextRow();          //注意游標是不帶行號的,需要的話直接循環獲取BAPIRET2.getString("aaa");//獲取第二行數據String xmldata = BAPIRET2.toXML();//直接處理xml去反序列化,簡單暴力。} catch (Exception e) {System.out.println(e.getMessage());return AjaxResult.error( "sap連接異常\r\n"+e.toString());}

開發踩坑

  1. 配置文件讀取連接信息,正常情況下直接@value即可。但是部分例子代碼使用靜態結構體創建連接,靜態結構體是編譯時執行,執行順序高于@value注解,導致空指針異常,無法注入,
  2. 解決方案1,使用上述方式創建連接
  3. 解決方案2,直接在結構體中讀yml文件,不過是否能讀取到配置中心的配置文件有待驗證。
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();yaml.setResources(new ClassPathResource("application.yml"));Properties properties = yaml.getObject();Properties connectProperties = new Properties();connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, (String) properties.get("sap.JCO_ASHOST"));

部署采坑

開發完本地跑沒有問題,但是打包部署后找不到SAPJCO的包,

Caused by: java.lang.ExceptionInInitializerError:JCo initialization failed with java.lang.ExceptionInInitializerError:Illegal JCo archive "sapjco3-3.1.2.jar".It is not allowed to rename or repackage the original archive "sapjco3.jar".

原因:
使用maven打包時會將依賴項jar包改名加上版本號
打包后可以看到jar包中對應文件為BOOT-INF\lib\sapjco3-3.1.2.jar
sapjco3.0.11之后版本加入對sapjco3.jar包校驗,如果文件名不符合啟動項目報錯
解決方案臨時,解壓jar包,改名,重新打包進去,

sap接口開發與實現、正式解決方案,加入以下POM,指定資源文件地址以及打包路徑(根據自己的資源文件目錄修改),避免maven亂改名:

<build><resources><resource><directory>src/main/resources</directory><targetPath>BOOT-INF</targetPath><includes><include>**/*.jar</include></includes></resource><resource><directory>src/main/resources/META-INF</directory><includes><include>spring.factories</include></includes><filtering>true</filtering></resource><resource><directory>src/main/resources</directory></resource></resources></build>

在這里插入圖片描述

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/196016.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息