Сборка JCoServer без файла свойств - PullRequest
1 голос
/ 19 августа 2010

Я получил еще один вопрос, связанный с JCo, и надеюсь найти помощь.

С JCo вы можете легко создать соединение, как это объясняется в примерах, поставляемых с библиотекой JCo.К сожалению, единственный способ построения соединения обрабатывается с помощью созданного файла свойств.Не было бы так плохо, если бы в нем не было никаких разумных данных.Но, по крайней мере, пароль для пользователя SAP находится в файле, поэтому в этом способе обработки соединений отсутствует безопасность.В руководстве JCo также сказано:

"Для этого примера конфигурация назначения хранится в файле, который вызывается программой. На практике вам следует избегать этого по соображениям безопасности."

но в конце концов не смог найти рабочее решение.Об этой теме есть несколько тем, вроде

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

, но ни одна из них не является полезной.Я действительно не могу найти решение и не могу найти ни одного.На самом деле я решил проблему безопасности с удалением файла после построения соединения, но это не является удовлетворительным решением.Должен быть лучший способ получить параметр для соединения, особенно когда оно указано в руководстве, но я не знаю, как это сделать.

Кто-нибудь уже работал с JCo 3.0 и знает эту проблему?

Ответы [ 2 ]

1 голос
/ 22 сентября 2010

Это немного сбивает с толку, мне было трудно понять это тоже.

Все, что вам нужно, - это объект типа java.util.Properties для заполнения требуемых полей, но вам решать, как заполнить этот объект.

Я делаю это через ValueObject, я могу заполнить этот VO из файла, базы данных, веб-формы ...

    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());

    }

Класс JCOProvider:

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());

        }


    }
}

Привет

1 голос
/ 19 августа 2010

Да, это возможно.Вы должны создать свою собственную реализацию DestinationDataProvider и зарегистрировать ее с помощью Environment.registerDestinationDataProvider ().Однако ваш DDP получает данные о соединении и учетные данные зависит от вас.Взгляните на net.sf.rcer.conn.connections.ConnectionManager , там есть рабочий пример.

Вам нужно

  • скопировать частноекласс, начинающийся со строки 66 и адаптирующий его к вашим собственным потребностям (то есть извлеките данные о подключении откуда угодно)
  • выполните регистрацию (строка 204) где-нибудь во время запуска вашего приложения
  • получить соединение, используя некоторый строковый идентификатор, который будет передан вашему DestinationDataProvider.
...