Springboot整合SAPJCO采坑
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:JAVAHOME/lib/dt.jar:{JAVA_HOME}/lib/tools.jar:JAVAHOME/lib/sapjco3.jarJREHOME={JAVA_HOME}/lib/sapjco3.jar JRE_HOME=JAVAHOME/lib/sapjco3.jarJREHOME={JAVA_HOME}/jre
LD_LIBRARY_PATH=dir:LDLIBRARYPATH:LD_LIBRARY_PATH:LDLIBRARYPATH:{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());}
开发踩坑
- 配置文件读取连接信息,正常情况下直接@value即可。但是部分例子代码使用静态结构体创建连接,静态结构体是编译时执行,执行顺序高于@value注解,导致空指针异常,无法注入,
- 解决方案1,使用上述方式创建连接
- 解决方案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采坑相关推荐
- 微信小程序后端mysql数据库_微信小程序后台springboot+mybatis+mysql“采坑”集锦
"采坑"错误集锦 1.service层 错误描述:2019-04-14 22:09:52.027 ERROR 8416 --- [nio-8082-exec-5] o.a.c.c. ...
- spring整合mybatis采坑
本来这个错误是整合spring和mybatis遇到的错误,但是一直没有解决,但是在做SpringMVC时也了出现了这样的错误 org.springframework.beans.factory.Bea ...
- springBoot整合Dubbo使用与采坑
参考:springBoot整合Dubbo 下载源码到:我的下载中心去下
- Springboot整合Websocket遇到的坑_websocket session不支持序列化,无法存储至redis_Websocket相关问题总结(Session共享,用户多端登录等)
Springboot整合Websocket遇到的坑 一.使用Springboot内嵌的tomcat启动websocket 1.添加ServerEndpointExporter配置bean @Confi ...
- 【SpringBoot DB系列】Jooq批量写入采坑记录
[SpringBoot DB系列]Jooq批量写入采坑记录 前面介绍了jooq的三种批量插入方式,结果最近发现这里面居然还有一个深坑,我以为的批量插入居然不是一次插入多条数据,而是一条一条的插入-,这 ...
- SpringBoot整合RabbitMq实战(一)
1 Spring AMQP 简介 Spring AMQP项目是一个引入Spring核心概念用于基于高级消息队列(AMQP)的解决方案的开发,它提供了一个模板用于发送和接受消息的高级抽象.它对基于消息驱 ...
- es springboot 不设置id_原创 | 一篇解决Springboot 整合 Elasticsearch
ElasticSearch 结合业务的场景,在目前的商品体系需要构建搜索服务,主要是为了提供用户更丰富的检索场景以及高速,实时及性能稳定的搜索服务. ElasticSearch是一个基于Lucene的 ...
- springboot整合shiro使用shiro-spring-boot-web-starter
此文章仅仅说明在springboot整合shiro时的一些坑,并不是教程 增加依赖 <!-- 集成shiro依赖 --> <dependency><groupId> ...
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例(转)...
SpringBoot整合mybatis.shiro.redis实现基于数据库的细粒度动态权限管理系统实例 shiro 目录(?)[+] 前言 表结构 maven配置 配置Druid 配置mybatis ...
最新文章
- 深度学习原理与TensorFlow实践
- Linux学习笔记--对文本的操作及正则表达式
- Centos6.x终端中文乱码
- 《青春飞扬》诗集出版历程与思考分享 之三:游记、感悟与思考
- const成员函数、const类对象、mutable数据成员
- 《娱乐至死》读书笔记(part5)--那些想当上帝的人把自己塑造成观众期望的形象
- 分区助手扩大c盘后自动修复_磁盘分区工具,这个好用;无论调整C盘还是系统迁移...
- mysql对测试如何_我如何对MySQL进行基准测试?
- ORA-00907:missing right parenthesis缺少右括号
- wdatepicker不展示秒_华为电源键只能开关机?其实还隐藏了这5个作用,一般人不知道...
- 黑盒(功能)测试基本方法
- bat使用命令解析-详细(转)
- Linux shell:sh csh tcsh ash bash dash zsh
- win10用html文件做壁纸,利用win10自带工具制作动态壁纸的简单方法
- ios开发所需图片尺寸汇总
- 乐学python公众号_乐的解释|乐的意思|汉典“乐”字的基本解释
- 理解区块链背后的Merkle Tree
- 从一道CTF题目学习Tanner图和LDPC
- strlen函数的使用
- D3D渲染技术之混合案例