JCO_ERROR_RESOURCE: пункт назначения ABAP_AS_WITHOUT_POOL не существует, ошибка при подключении через JCo

Я работаю над приложением Java, которому необходимо получать данные из нашей системы SAP, лежащей в таблице SAP. Я пытаюсь подключить SW к SAP с помощью SAP Java Connector 3.X, но у меня возникают проблемы с пунктом назначения.

Я использовал примеры кода, поставляемые с 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);
    }
} 

}

Это сообщение об ошибке, которое я получаю от NetBeans:

Целевой ABAP_AS_WITHOUT_POOL работает Выполнение в целевом ABAP_AS_WITHOUT_POOL не удалось com.sap.conn.jco.rt.DefaultDestinationManager.searchDestination(DefaultDestinationManager.java:382) в com.sap.conn.jco.rt.DefaultDestinationManager.getDestinationInstance(DefaultDestinationManager.java:100) в com.sap.conn.jco. JCoDestinationManager.getDestination(JCoDestinationManager.java:104) в jcotest2.CustomDestinationDataProvider.executeCalls(CustomDestinationDataProvider.java:92) в jcotest2.Main.main(Main.java:39)

ПОСТРОИТЬ УСПЕШНО (общее время: 2 секунды)


person Deep13    schedule 20.05.2019    source источник


Ответы (2)


Похоже, ваш код хранит данные для входа в HashMap «secureDBStorage». Где вы заполняете этот HashMap?

Также: для чего вам нужен метод createDestinationDataFile(), если вы используете HashMap, а не файл?

Редактировать: поскольку этот пост был удален обзором, сейчас я пытаюсь сделать его более точным. Итак, есть две проблемы с вашим кодом:

  1. Вы сохраняете параметры входа в свои серверные системы в HashMap с именем «secureDBStorage», но вы не заполняли эту карту параметрами для системы/назначения с именем «ABAP_AS_WITHOUT_POOL».

  2. Ваш код по-прежнему содержит метод createDestinationDataFile(), который, вероятно, был скопирован из примера программы, а затем забыт. Поскольку ваша программа использует HashMap для хранения параметров входа в систему, а не файловую систему, вы можете удалить этот метод. (Только путает программу.)

person Lanzelot    schedule 17.09.2019
comment
Это не дает ответа на вопрос. Вместо этого напишите комментарий. - person Dharman; 17.09.2019
comment
Этот пост действительно дает ответ на вопрос (или, скорее, решение проблемы Deep13). Возможно, мне следовало сформулировать это не как риторические вопросы, а как утверждения... - person Lanzelot; 11.02.2020

Перед вызовом пункта назначения вы должны создать его в диспетчере конфигураций SAP Java Application Server (NWA Manager), а затем вызывать только его.

https://help.sap.com/doc/saphelp_nwpi711/7.1.1/en-US/07/0d27932264284b883dab13ce1008a6/frameset.htm

Вот образец:

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

Я не вижу, где вы заполняете переменную ABAP_AS в своем коде, как в примере.

person Suncatcher    schedule 20.06.2019
comment
Это неприменимо, поскольку Deep13, по-видимому, использует автономный JCo в простом старом Java-приложении (начиная с Main.main()…), а не в сервлете в Java-стеке NetWeaver. - person Lanzelot; 17.09.2019