Строительство JCoserver без объекта недвижимости
-
29-09-2019 - |
Вопрос
У меня есть еще один вопрос, связанный с JCO и, надеюсь, нашел помощь.
С JCO вы можете легко создать соединение, как это объясняется в листах примеров, которые поставляются с JCO-библиотекой. К сожалению, единственный способ построения соединения обрабатывается с созданным файлом свойств. Это не было бы так плохо, если бы в нем не было никаких разумных данных. Но, по крайней мере, пароль для пользователя SAP стоит в файле, так что в этом способе обработки подключения это отсутствие безопасности. Руководство JCO также говорит:
«Для этого примера конфигурация назначения хранится в файле, который называется программой. На практике вы должны избегать этого по соображениям безопасности».
но не мог найти рабочее решение в конце концов. В этой теме есть пальмовые темы, как это
http://forums.sdn.sap.com/thread.jspa?messageid=7303957
Но ни один из них не полезен. Я действительно не могу выяснить решение, и ни один из них не находит его. На самом деле я решил прозрачность безопасности с удалением файла после построения соединения, но это не удовлетворяющее решение. Должен быть лучший способ получить параметр для соединения, особенно когда он находится в руководстве, но у меня нет клей.
Кто -нибудь уже работал с JCO 3.0 и знает эту проблему?
Решение
Да, это возможно. Вы должны создать свою собственную реализацию DestinationDataprovider и зарегистрировать ее с помощью Environment.RegisterDestinationDatapRovider (). Однако ваш DDP получает данные об соединении, и учетные данные зависит от вас. Взгляни на net.sf.rcer.conn.connections.connectionmanager, там есть рабочий пример.
Тебе нужно
- Скопируйте частный класс, начиная с строки 66 и адаптируйте его к своим собственным потребностям (то есть извлеките данные соединения, где бы вы ни хотели)
- Выполните регистрацию (строка 204) где -то во время запуска вашей заявки
- Получите соединение, используя какой -то идентификатор строки, который будет передаваться в ваш destinationDataproVider.
Другие советы
Это немного сбивает с толку, мне тоже было дико, как это понять.
Все, что вам нужно, это объект типа 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());
}
}
}
С уважением