3

我正在尝试使用 JCo 连接到 SAP ECC 6.0。我正在关注教程。但是,有一个注释说:

For this example the destination configuration is stored in a file that is called by the program. In practice you should avoid this for security reasons.

这是合理且可以理解的。但是,没有说明如何设置安全目的地提供者。我在这个线程中找到了创建自定义实现DestinationDataProvider并在我的本地机器上工作的解决方案。但是当我在 Portal 上部署它时,我收到一条错误消息,指出已经注册了DestinationDataProvider. 所以我的问题是: 如何在 SAP Java EE 应用程序中存储目标数据?

这是我的代码,以进一步阐明我要做什么。

public static void main(String... args) throws JCoException {
        CustomDestinationProviderMap provider = new CustomDestinationProviderMap();
        com.sap.conn.jco.ext.Environment.registerDestinationDataProvider(provider);

        Properties connectProperties = new Properties();
        connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "host.sap.my.domain.com");
        connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR, "00");
        connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "100");
        connectProperties.setProperty(DestinationDataProvider.JCO_USER, "user");
        connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "password");
        connectProperties.setProperty(DestinationDataProvider.JCO_LANG, "en");

        provider.addDestination(DESTINATION_NAME1, connectProperties);
        connect();
    }

    public static void connect() throws JCoException {
        String FUNCTION_NAME = "BAPI_EMPLOYEE_GETDATA";
        JCoDestination destination = JCoDestinationManager.getDestination(DESTINATION_NAME1);
        JCoContext.begin(destination);

        JCoFunction function = destination.getRepository().getFunction(FUNCTION_NAME);
        if (function == null) {
            throw new RuntimeException(FUNCTION_NAME + " not found in SAP.");
        }

        //function.getImportParameterList().setValue("EMPLOYEE_ID", "48");
        function.getImportParameterList().setValue("FSTNAME_M", "ANAKIN");
        function.getImportParameterList().setValue("LASTNAME_M", "SKYWALKER");

        try {
            function.execute(destination);
        } catch (AbapException e) {
            System.out.println(e.toString());
            return;
        }

        JCoTable table = function.getTableParameterList().getTable("PERSONAL_DATA");
        for (int i = 0; i < table.getNumRows(); i++) {
            table.setRow(i);
            System.out.println(table.getString("PERNO") + '\t' + table.getString("FIRSTNAME") + '\t' + table.getString("LAST_NAME")
            +'\t' + table.getString("BIRTHDATE")+'\t' + table.getString("GENDER"));
        }

        JCoContext.end(destination);
    }
4

2 回答 2

4

好的,所以我开始着手并认为我会分享我的研究。您需要在 Portal 中添加自己的目的地。要实现这一点,您需要访问位于以下位置的 NetWeaver 管理员:host:port/nwa。所以它会是这样的sapportal.your.domain.com:50000/nwa

然后你去Configuration-> Infrastructure->Destinations并在那里添加你的目的地。您可以将消息服务器等大部分字段留空。重要的部分是目标名称,因为它是您检索它的方式以及在我的情况下应该设置为 RFC 目标的目标类型。尝试 ping 您新创建的目的地以检查其是否正常运行。

最后,您应该能够通过简单地调用来获得目的地:JCoDestination destination = JCoDestinationManager.getDestination(DESTINATION_NAME);因为它已添加到您的 Portal 环境并从那里进行管理。

于 2015-09-07T07:56:39.480 回答
3

查看 Jco 连接器下载的 JCo 示例中的 CustomDestinationDataProvider。重要的部分是:

static class MyDestinationDataProvider implements DestinationDataProvider
...
com.sap.conn.jco.ext.Environment.registerDestinationDataProvider(new MyDestinationDataProvider());

然后你可以简单地做:

instance = JCoDestinationManager.getDestination(DESTINATION_NAME);

顺便提一句。您可能还想查看http://hibersap.org/,因为它们也提供了存储配置的好方法。

于 2015-12-08T13:49:05.653 回答