Reputation: 1
I am working on a Java app that needs to get data from our SAP system laying in SAP table. I try to connect the SW with SAP system using SAP Java Connector 3.X, but I'm having trouble with the Destination.
I used the Code-Examples that came with the SAP Java Connector.
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);
}
}
}
This is the error message I get from 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)
Upvotes: 0
Views: 3790
Reputation: 16605
It looks like your code keeps the logon data in the HashMap "secureDBStorage". Where do you fill this HashMap?
Also: what do you need the method "createDestinationDataFile()" for, if you are using a HashMap and not a file?
Edit: as this post got deleted by review, I'm trying to make it more precise now. So there are two problems with your code:
You keep the logon parameters of your backend systems in a HashMap named "secureDBStorage", but you did not fill this map with parameters for the system/destination named "ABAP_AS_WITHOUT_POOL".
Your code still contains the method "createDestinationDataFile()", which was probably copied from the sample program and then forgotten to delete. As your program is using a HashMap for storing the logon parameters and not the file system, you can delete this method. (Only confuses the program.)
Upvotes: 1
Reputation: 10621
Prior to calling the destination you should create it in Configuration Manager of SAP Java Application Server (NWA Manager) and then only call it.
https://help.sap.com/doc/saphelp_nwpi711/7.1.1/enUS/07/0d27932264284b883dab13ce1008a6/frameset.htm
Here is the sample:
static String ABAP_AS = "WD_MODELDATA_DEST";
PrintWriter out = response.getWriter();
JCoDestination destination;
try {
destination = JCoDestinationManager.getDestination(ABAP_AS);
out.println("Attributes:");
out.println(destination.getAttributes());
out.println();
} catch (JCoException e) {
e.printStackTrace();
out.println(e.getMessage());
}
I don't see where you fill ABAP_AS
variable in your code like in the sample.
Upvotes: 0