我正在开发一个 Java 应用程序,需要从 SAP 表中的 SAP 系统获取数据。我尝试使用 SAP Java Connector 3.X 将软件与 SAP 系统连接,但我在使用目标时遇到问题。

我使用了 SAP Java 连接器附带的代码示例。

public class CustomDestinationDataProvider { 
 
static class MyDestinationDataProvider implements DestinationDataProvider { 
    private DestinationDataEventListener eL; 
    private HashMap<String, Properties> secureDBStorage = new HashMap<String, Properties>(); 
     
    public Properties getDestinationProperties(String ABAP_AS) { 
        try { 
            //read the destination from DB 
            Properties p = secureDBStorage.get(ABAP_AS); 
 
            if(p!=null) { 
                //check if all is correct, for example 
                if(p.isEmpty()) 
                    throw new DataProviderException(DataProviderException.Reason.INVALID_CONFIGURATION, "destination configuration is incorrect", null); 
 
                return p;  
                } 
             
            return null;  
            } catch(RuntimeException re) { 
            throw new DataProviderException(DataProviderException.Reason.INTERNAL_ERROR, re); 
        } 
    } 
 
    //An implementation supporting events has to retain the eventListener instance provided 
    //by the JCo runtime. This listener instance shall be used to notify the JCo runtime 
    //about all changes in destination configurations. 
    public void setDestinationDataEventListener(DestinationDataEventListener eventListener) { 
        this.eL = eventListener; 
    } 
 
    public boolean supportsEvents() { 
        return true; 
    } 
 
    //implementation that saves the properties in a very secure way 
    void changeProperties(String ABAP_AS, Properties properties) { 
        synchronized(secureDBStorage) { 
            if(properties==null) { 
                if(secureDBStorage.remove(ABAP_AS)!=null) 
                    eL.deleted(ABAP_AS); 
            } else { 
                secureDBStorage.put(ABAP_AS, properties); 
                eL.updated(ABAP_AS); // create or updated 
            } 
        } 
    } 
} // end of MyDestinationDataProvider 
 
//business logic 
void executeCalls(String ABAP_AS) { 
    JCoDestination dest; 
    try { 
        dest = JCoDestinationManager.getDestination(ABAP_AS); 
        dest.ping(); 
        System.out.println("Destination " + ABAP_AS + " works"); 
    } catch(JCoException e) { 
        e.printStackTrace(); 
        System.out.println("Execution on destination " + ABAP_AS + " failed"); 
    } 
} 
 
static Properties getDestinationPropertiesFromUI() { 
    //adapt parameters in order to configure a valid destination 
    Properties connectProperties = new Properties(); 
    connectProperties.setProperty(DestinationDataProvider.JCO_ASHOST, "XXX"); 
    connectProperties.setProperty(DestinationDataProvider.JCO_SYSNR,  "XX"); 
    connectProperties.setProperty(DestinationDataProvider.JCO_CLIENT, "XXX"); 
    connectProperties.setProperty(DestinationDataProvider.JCO_USER,   "XXX"); 
    connectProperties.setProperty(DestinationDataProvider.JCO_PASSWD, "XXX"); 
    connectProperties.setProperty(DestinationDataProvider.JCO_LANG,   "XX"); 
    createDestinationDataFile(ABAP_AS, connectProperties); 
    return connectProperties; 
} 
 
static void createDestinationDataFile(String ABAP_AS, Properties connectProperties) { 
    File destCfg = new File(ABAP_AS + ".jcoDestination"); 
    try { 
        FileOutputStream fos = new FileOutputStream(destCfg, false); 
        connectProperties.store(fos, "for tests only!"); 
        fos.close(); 
    } catch (Exception e) { 
        throw new RuntimeException("Unable to create the destination files", e); 
    } 
}  

}

这是我从 NetBeans 收到的错误消息:

Destination ABAP_AS_WITHOUT_POOL works 
Execution on destination ABAP_AS_WITHOUT_POOL failed 
com.sap.conn.jco.JCoException: (106) JCO_ERROR_RESOURCE: Destination  
    ABAP_AS_WITHOUT_POOL does not exist 
at com.sap.conn.jco.rt.DefaultDestinationManager.update(DefaultDestinationManager.java:217) 
at com.sap.conn.jco.rt.DefaultDestinationManager.searchDestination(DefaultDestinationManager.java:382) 
at com.sap.conn.jco.rt.DefaultDestinationManager.getDestinationInstance(DefaultDestinationManager.java:100) 
at com.sap.conn.jco.JCoDestinationManager.getDestination(JCoDestinationManager.java:104) 
at jcotest2.CustomDestinationDataProvider.executeCalls(CustomDestinationDataProvider.java:92) 
at jcotest2.Main.main(Main.java:39) 
BUILD SUCCESSFUL (total time: 2 seconds) 

请您参考如下方法:

看起来您的代码将登录数据保留在 HashMap“secureDBStorage”中。你在哪里填充这个HashMap?

另外:如果您使用的是 HashMap 而不是文件,您需要“createDestinationDataFile()”方法做什么?

编辑:由于这篇文章已被审核删除,我现在正在努力使其更加准确。所以你的代码有两个问题:

  1. 您将后端系统的登录参数保存在名为“secureDBStorage”的 HashMap 中,但没有使用名为“ABAP_AS_WITHOUT_POOL”的系统/目标的参数填充此映射。

  2. 您的代码仍然包含方法“createDestinationDataFile()”,该方法可能是从示例程序中复制的,然后忘记删除。由于您的程序使用 HashMap 来存储登录参数而不是文件系统,因此您可以删除此方法。 (只会混淆程序。)


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!