1

我收到了另一个与 JCo 相关的问题,希望能找到帮助。

使用 JCo,您可以轻松地建立连接,就像 JCo 库附带的示例表中所解释的那样。不幸的是,建立连接的唯一方法是使用创建的属性文件来处理。如果其中没有任何明智的数据,它不会那么糟糕。但至少 SAP 用户的密码存在于文件中,因此这种连接处理方式缺乏安全性。JCo 的手册也是这么说的:

“对于这个例子,目标配置存储在程序调用的文件中。实际上,出于安全原因,您应该避免这种情况。”

但毕竟找不到可行的解决方案。关于这个主题有很多话题,就像这样

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

但它们都没有帮助。我真的想不出一个解决方案,也没有找到一个。实际上,我在建立连接后通过删除文件解决了安全问题,但这不是一个令人满意的解决方案。必须有更好的方法来获取连接参数,尤其是当它出现在手册中时,但我不知道如何使用。

有人已经使用过 JCo 3.0 并且知道这个问题吗?

4

2 回答 2

1

是的,这是可能的。您必须创建自己的 DestinationDataProvider 实现并使用 Environment.registerDestinationDataProvider() 注册它。但是,您的 DDP 获取连接数据和凭据取决于您。看看net.sf.rcer.conn.connections.ConnectionManager,那里有一个工作示例。

你需要

  • 从第 66 行开始复制私有类并使其适应您自己的需要(即,从您想要的任何地方获取连接数据)
  • 在应用程序启动期间的某处执行注册(第 204 行)
  • 使用将传递给您的 DestinationDataProvider 的一些字符串标识符获取连接。
于 2010-08-19T18:11:54.740 回答
1

这有点令人困惑,我也很难弄清楚这一点。

您只需要一个 java.util.Properties 类型的对象来填充所需的字段,但如何填充此对象取决于您。

我通过 ValueObject 编辑它,我可以从文件、数据库、Web 表单中填充这个 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());

        }


    }
}

问候

于 2010-09-22T11:33:55.197 回答