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指向本地相对路径

创建连接

  • 使用自带方法写入本地配置文件,并读取,创建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包,改名,重新打包进去,

正式解决方案,加入以下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>

Springboot整合SAPJCO采坑相关推荐

  1. 微信小程序后端mysql数据库_微信小程序后台springboot+mybatis+mysql“采坑”集锦

    "采坑"错误集锦 1.service层 错误描述:2019-04-14 22:09:52.027 ERROR 8416 --- [nio-8082-exec-5] o.a.c.c. ...

  2. spring整合mybatis采坑

    本来这个错误是整合spring和mybatis遇到的错误,但是一直没有解决,但是在做SpringMVC时也了出现了这样的错误 org.springframework.beans.factory.Bea ...

  3. springBoot整合Dubbo使用与采坑

    参考:springBoot整合Dubbo 下载源码到:我的下载中心去下

  4. Springboot整合Websocket遇到的坑_websocket session不支持序列化,无法存储至redis_Websocket相关问题总结(Session共享,用户多端登录等)

    Springboot整合Websocket遇到的坑 一.使用Springboot内嵌的tomcat启动websocket 1.添加ServerEndpointExporter配置bean @Confi ...

  5. 【SpringBoot DB系列】Jooq批量写入采坑记录

    [SpringBoot DB系列]Jooq批量写入采坑记录 前面介绍了jooq的三种批量插入方式,结果最近发现这里面居然还有一个深坑,我以为的批量插入居然不是一次插入多条数据,而是一条一条的插入-,这 ...

  6. SpringBoot整合RabbitMq实战(一)

    1 Spring AMQP 简介 Spring AMQP项目是一个引入Spring核心概念用于基于高级消息队列(AMQP)的解决方案的开发,它提供了一个模板用于发送和接受消息的高级抽象.它对基于消息驱 ...

  7. es springboot 不设置id_原创 | 一篇解决Springboot 整合 Elasticsearch

    ElasticSearch 结合业务的场景,在目前的商品体系需要构建搜索服务,主要是为了提供用户更丰富的检索场景以及高速,实时及性能稳定的搜索服务. ElasticSearch是一个基于Lucene的 ...

  8. springboot整合shiro使用shiro-spring-boot-web-starter

    此文章仅仅说明在springboot整合shiro时的一些坑,并不是教程 增加依赖 <!-- 集成shiro依赖 --> <dependency><groupId> ...

  9. SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例(转)...

    SpringBoot整合mybatis.shiro.redis实现基于数据库的细粒度动态权限管理系统实例 shiro 目录(?)[+] 前言 表结构 maven配置 配置Druid 配置mybatis ...

最新文章

  1. 深度学习原理与TensorFlow实践
  2. Linux学习笔记--对文本的操作及正则表达式
  3. Centos6.x终端中文乱码
  4. 《青春飞扬》诗集出版历程与思考分享 之三:游记、感悟与思考
  5. const成员函数、const类对象、mutable数据成员
  6. 《娱乐至死》读书笔记(part5)--那些想当上帝的人把自己塑造成观众期望的形象
  7. 分区助手扩大c盘后自动修复_磁盘分区工具,这个好用;无论调整C盘还是系统迁移...
  8. mysql对测试如何_我如何对MySQL进行基准测试?
  9. ORA-00907:missing right parenthesis缺少右括号
  10. wdatepicker不展示秒_华为电源键只能开关机?其实还隐藏了这5个作用,一般人不知道...
  11. 黑盒(功能)测试基本方法
  12. bat使用命令解析-详细(转)
  13. Linux shell:sh csh tcsh ash bash dash zsh
  14. win10用html文件做壁纸,利用win10自带工具制作动态壁纸的简单方法
  15. ios开发所需图片尺寸汇总
  16. 乐学python公众号_乐的解释|乐的意思|汉典“乐”字的基本解释
  17. 理解区块链背后的Merkle Tree
  18. 从一道CTF题目学习Tanner图和LDPC
  19. strlen函数的使用
  20. D3D渲染技术之混合案例

热门文章

  1. 1 go语言:go语言开发包安装及Goland的安装激活
  2. Java中的Cloneable接口
  3. 数据结构之python实现循环单链表实例
  4. 【软考备战·希赛网每日一练】2023年5月3日
  5. c#快捷菜单contextMenuStrip的使用
  6. 【Unique函数】Unique函数用法
  7. unique函数用法
  8. 从Attention到Bert——1 Attention解读
  9. java中write方法作用_java中的封装,继承,多态,这3个在程序中起着重要作用
  10. docker运行yyets_docker常用命令汇总