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 型のオブジェクトだけですが、このオブジェクトに入力する方法は自由です。

ファイル、データベース、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 に答える