Pregunta

Tengo otra pregunta relacionada con JCo y es de esperar encontrar ayuda.

Con JCo usted puede construir fácilmente una conexión, como se explica en las hojas de ejemplo, que venían con el JCo-biblioteca. Por desgracia, la única manera de construir una conexión se maneja con un archivo de propiedades creado. Que no estaríamos tan malo, si hay alguna había't datos sensibles en ella. Pero al menos, la contraseña del usuario de SAP se encuentra en el archivo, por lo que es una falta de seguridad en este modo de conexión de manipulación. El manual de JCo lo dice, también:

"Para este ejemplo, la configuración de destino se almacena en un archivo que se llama por el programa. En la práctica, debe evitarse por razones de seguridad."

pero no podía encontrar una solución de trabajo después de todo. Hay palmful las discusiones sobre este tema, como este

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

pero ninguno de ellos son útiles. Me cifra realmente que no podrán encontrar una solución y no encontrar uno. En realidad he resuelto el problema de seguridad, borrar el archivo después de la construcción de la conexión, pero esto no es una solución satisfactoria. Tiene que haber una mejor manera de conseguir el parámetro para la conexión, sobre todo cuando se encuentra en el manual, pero no tengo cómo pegamento.

Cualquier persona que ya trabajó con JCo 3.0 y conoce este problema?

¿Fue útil?

Solución

Sí, eso es posible. Usted tiene que crear su propia implementación de DestinationDataProvider y registrarlo usando Environment.registerDestinationDataProvider (). Sin embargo, su DDP obtiene los datos de conexión y las credenciales depende de usted. Echar un vistazo a net.sf.rcer.conn.connections.ConnectionManager , hay un ejemplo de trabajo en ese país.

Es necesario

  • copiar la clase privada a partir de la línea 66 y adaptarlo a sus propias necesidades (es decir, ir a buscar los datos de conexión desde donde se desea)
  • realizar el registro (línea 204) en algún lugar durante el inicio de la aplicación
  • conseguir la conexión utilizando algún identificador de cadena que se pasará a su DestinationDataProvider.

Otros consejos

Es un poco confuso, que fue dificil para mí la manera de resolver esto también.

Todo lo que necesita es un objeto de tipo java.util.Properties para llenar los campos deseados, pero es hasta ou cómo llenar este objeto.

DIT a través de un ValueObject, puedo llenar este VO de un archivo, base de datos, formulario web ...

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

    }

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

        }


    }
}

Regards

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top