SpringBoot调用SAP接口(搭建部署)

一、项目搭建

  1. 创建项目,添加依赖
  2. 引入maven依赖
  3. 编写工具类
  4. 测试是否成功
  5. 注意事项

二、打包部署

一、项目搭建

1、创建Maven项目,在src/main/resource目录下创建lib文件夹,导入sap依赖

 2、pom.xml中引入以下依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath />
    </parent>

    <properties>
        <!-- 文件拷贝时的编码 -->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <!-- 编译时的编码 -->
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--  springboot 整合web组件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Hutool依赖-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- alibaba JSONObject 依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.30</version>
        </dependency>
        <!--引入sap依赖-->
        <dependency>
            <groupId>com.sap</groupId>
            <artifactId>sapjco3</artifactId>
            <version>3.1.0</version>
            <scope>system</scope>
            <!--这是我项目中依赖地址,可根据自己依赖修改对应目录--><systemPath>${project.basedir}/src/main/resources/lib/sapjco3.jar</systemPath>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!--设置为true,以便把本地的system的jar也包括进来-->
                    <includeSystemScope>true</includeSystemScope>
                </configuration>
            </plugin>
        </plugins>
    </build>

3、创建工具类,SapUtils

package com.wang.sap.util;

import com.sap.conn.jco.*;
import com.sap.conn.jco.ext.DestinationDataProvider;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.FileOutputStream;
import java.util.*;

/**
 * @author wanggang
 * @date 2023/3/2
 */
@Slf4j
public class SapUtils {

    public static JCoFunction getJCoFunction(JCoDestination jCoDestination, String functionName) throws JCoException {
        JCoFunctionTemplate functionTemplate = jCoDestination.getRepository().getFunctionTemplate(functionName);
        return functionTemplate.getFunction();
    }

    /**
     * 获取JCoDestination
     * @param functionName  SAP函数名称
     * @return JCoDestination
     */
    public static JCoDestination getJcoConnection(String functionName) throws Exception {
        Properties properties = new Properties();
        properties.setProperty(DestinationDataProvider.JCO_ASHOST, "127.0.0.1");//sap服务器地址
        properties.setProperty(DestinationDataProvider.JCO_SYSNR, "00");//系统编号,找SAP核对写00就可以了
        properties.setProperty(DestinationDataProvider.JCO_CLIENT, "800");//集团号,不知道就问你们的sap basis
        properties.setProperty(DestinationDataProvider.JCO_USER, "root");//帐号
        properties.setProperty(DestinationDataProvider.JCO_PASSWD, "123123");//密码
        properties.setProperty("jco.client.lang", "zh");    //语言

        //使用连接池
        properties.setProperty("jco.destination.peak_limit", "10"); //最大活动连接数,0表示无限制
        properties.setProperty("jco.destination.pool_capacity", "3");   //空闲连接数,如果为0,则没有连接池效果,默认为1
        log.info("properties = " + properties.toString());

        //生成配置文件,JCoDestinationManager.getDestination()调用时会需要该连接配置文件,后缀名需要为jcoDestination
        FileOutputStream fos = null;
        String suffix = "jcoDestination";
        File cfg = new File(functionName + "." + suffix);
        if (!cfg.exists()) {
            try {
                fos = new FileOutputStream(cfg, false);
                properties.store(fos, "for tests only !");
                fos.close();
            } catch (Exception var9) {
                throw new Exception("Unable to create the destination file " + cfg.getName(), var9);
            } finally {
                if (null != fos) {
                    fos.close();
                }
            }
        }
        return JCoDestinationManager.getDestination(functionName);
    }


}

4、测试

import com.sap.conn.jco.JCoDestination;
import com.sap.conn.jco.JCoFunction;
import com.sap.conn.jco.JCoParameterList;
import com.sap.conn.jco.JCoTable;
import com.wang.sap.util.SapUtils;
import lombok.extern.slf4j.Slf4j;

/**
 * @author wanggang
 * @date 2023/3/3
 */
@Slf4j
public class SapTest {
    public static void main(String[] args) throws Exception {
        String functionName="ZHRFU_KQYC_OA";    //函数名
        String tableName="ET_DATA"; //表名
        JCoDestination jcoConnection = SapUtils.getJcoConnection(functionName);
        JCoFunction function = SapUtils.getJCoFunction(jcoConnection, functionName);
        //获取接口参数格式
        String toXML = function.toXML();
        log.info("接口参数:"+toXML);
        //SAP接口参数分为INPUT和TABLES两种,赋值方式不一样
        //INPUT类型的参数赋值
        JCoParameterList inputParams = function.getImportParameterList();
        inputParams.setValue("IV_BEGDA","20230301");
        inputParams.setValue("IV_ENDDA","20230303");
        //TABLES表参数赋值
        JCoTable jCoFields = function.getTableParameterList().getTable(tableName);
        for (int i = 1  ; i <=2; i++) {
            //给表格的第几行写入数据,写入第一行的下标是1
            jCoFields.setRow(i);
            jCoFields.appendRow();
            jCoFields.setValue("MANDT","8000");
            jCoFields.setValue("ZINDEX",i);
        }

        function.execute(jcoConnection);
        log.info("返回结果="+function.toXML());
        JCoParameterList tableParameterList = function.getTableParameterList();
        //获取SAP标准返回结果OUTPUT
        Object ev_type = function.getExportParameterList().getValue("EV_TYPE"); //状态码
        Object ev_message = function.getExportParameterList().getValue("EV_MESSAGE");   //文本信息
        //获取SAP返回的表数据,ET_DATA是表名
        JCoTable et_data = tableParameterList.getTable("ET_DATA");
        log.info("et_data="+et_data.toXML());
        int numRows = et_data.getNumRows(); //返回数据行数
        for (int j = 0; j < numRows; j++) {
            //读取数据,第一行的下标是0
            et_data.setRow(j);
            et_data.getString("MANDT");
        }
    }
}

5、注意事项

  • 修改连接配置需要删除之前生成的文件,否则不会生效
  • 参数赋值时注意是什么类型的参数,返回数据也是同样的
  • 如果没有接口文档,获取function后执行function.toXML()方法,可以看到所有参数和数据
  • pom.xml中一定要加入以下依赖,否则项目打包sap的依赖包不会引入jar中
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <configuration>
                        <!--设置为true,以便把本地的system的jar也包括进来-->
                        <includeSystemScope>true</includeSystemScope>
                    </configuration>
                </plugin>
            </plugins>
        </build>

二、打包部署

        因为我们创建的是Maven项目,使用的是外部依赖,打包的时候会导致外部依赖名称和jar中的依赖名称不一致,这时候运行jar或者执行相关代码就会报一个错误

 解决方法:

          第一种:打成jar包后,用解压文件打开,找到apjco3-3.1.0.jar重命名apjco3.jar

 

第二种:修改pom.xml,在build——>resources节点中加入以下代码(推荐)

            <resource>
                <!--外部jar存放路径-->
                <directory>${project.basedir}/src/main/resources/lib</directory>
                <targetPath>BOOT-INF/lib/</targetPath>
                <includes>
                    <include>**/*.jar</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <targetPath>BOOT-INF/classes/</targetPath>
            </resource>

这样打包后jar文件中级会有一个没有重命名的sap依赖包,直接运行即可

sap依赖:https://pan.baidu.com/s/1rC_xJ_vqDbOkk4lS0vlEPw?pwd=1234

项目地址:https://gitee.com/wzzwg_admin/wang-sap

参考博客:https://blog.csdn.net/bj_chengrong/article/details/109498275

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值