Building JCoServer without Properties-File

让人想犯罪 __ 提交于 2019-12-08 05:47:57

问题


I got another JCo-related question and hopefully finding help.

With JCo you can easily build up a connection like it is explained in the example sheets which came with the JCo-library. Unfortunately, the only way building a connection is handled with a created property file. It wouldn´t be that bad, if there wasn´t any sensible data in it. But at least, the password for the SAP user stands in the file, so it is a lack of safety in this way of connection-handling. The manual of JCo says so, too :

"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."

but couldn´t find a working solution after all. There are a palmful threads about this theme, like this

http://forums.sdn.sap.com/thread.jspa?messageID=7303957

but none of them are helpful. I really can´t figure out a solution and neither find one. Actually I solved the security-problem with deleting the file after building the connection, but this is not a satisfying solution. There have to be a better way getting the parameter for the connection, especially when it stands in the manual, but I have no glue how.

Anybody already worked with JCo 3.0 and knows this problem?


回答1:


Yes, that's possible. You have to create your own implementation of DestinationDataProvider and register it using Environment.registerDestinationDataProvider(). However your DDP obtains the connection data and credentials is up to you. Take a look at net.sf.rcer.conn.connections.ConnectionManager, there's a working example in there.

You need to

  • copy the private class starting on line 66 and adapt it to your own needs (that is, fetch the connection data from wherever you want to)
  • perform the registration (line 204) somewhere during the startup of your application
  • get the connection using some string identifier that will be passed to your DestinationDataProvider.



回答2:


It's a bit confusing, it was dificult to me how to figure this too.

All you need is an object of type java.util.Properties to fill the desired fields, but it's up to ou how to fill this object.

I dit it through a ValueObject, I can fill this VO from a file, database, web form...

    JCOProvider jcoProvider = null;
    SAPVO sap = new SAPVO(); // Value Object
    Properties properties = new Properties();

    if(jcoProvider == null) {


        // Get SAP config from DB
        try {
            sap = SAPDAO.getSAPConfig(); // DAO object that gets conn data from DB
        } catch (Exception ex) {
            throw new ConexionSAPException(ex.getMessage());
        }

         // Create new conn
        jcoProvider = new JCOProvider();

    }

    properties.setProperty(DestinationDataProvider.JCO_ASHOST,        sap.getJCO_ASHOST());
    properties.setProperty(DestinationDataProvider.JCO_SYSNR,         sap.getJCO_SYSNR());
    properties.setProperty(DestinationDataProvider.JCO_CLIENT,        sap.getJCO_CLIENT());
    properties.setProperty(DestinationDataProvider.JCO_USER,          sap.getJCO_USER());
    properties.setProperty(DestinationDataProvider.JCO_PASSWD,        sap.getJCO_PASSWD());
    properties.setProperty(DestinationDataProvider.JCO_LANG,          sap.getJCO_LANG());
//    properties.setProperty(DestinationDataProvider.JCO_TRACE,         "10");

    try {

        jcoProvider.changePropertiesForABAP_AS(properties);

    } catch (Exception e) {

        throw new ConexionSAPException(e.getMessage());

    }

The JCOProvider class:

import com.sap.conn.jco.ext.DestinationDataEventListener;
import com.sap.conn.jco.ext.DestinationDataProvider;
import com.sap.conn.jco.ext.Environment;
import es.grupotec.ejb.util.ConexionSAPException;
import java.util.Properties;

public class JCOProvider implements DestinationDataProvider {

    private String SAP_SERVER = "SAPSERVER";
    private DestinationDataEventListener eventListener;
    private Properties ABAP_AS_properties;

    public JCOProvider() {
    }

    @Override
    public Properties getDestinationProperties(String name) {

        if (name.equals(SAP_SERVER) && ABAP_AS_properties != null) {
            return ABAP_AS_properties;
        } else {
            return null;
        }
//        if(ABAP_AS_properties!=null) return ABAP_AS_properties;
//        else throw new RuntimeException("Destination " + name + " is not available");

    }

    @Override
    public boolean supportsEvents() {
        return true;
    }

    @Override
    public void setDestinationDataEventListener(DestinationDataEventListener eventListener) {
        this.eventListener = eventListener;
    }

    public void changePropertiesForABAP_AS(Properties properties) throws ConexionSAPException {

        try {

            if (!Environment.isDestinationDataProviderRegistered()) {

                if (ABAP_AS_properties == null) {
                    ABAP_AS_properties = properties;
                }
                Environment.registerDestinationDataProvider(this);

            }

            if (properties == null) {

                if (eventListener != null) {
                    eventListener.deleted(SAP_SERVER);
                }
                ABAP_AS_properties = null;

            } else {

                ABAP_AS_properties = properties;
                if (eventListener != null) {
                    eventListener.updated(SAP_SERVER);
                }

            }

        } catch (Exception ex) {

            throw new ConexionSAPException(ex.getMessage());

        }


    }
}

Regards



来源:https://stackoverflow.com/questions/3521272/building-jcoserver-without-properties-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!