2016-04-29 14 views
1

データベースへの参照を格納するPCConfigというcacheBeanがあるので、他のJavaメソッドでアクセスできます。私はPCConfigクラスをインポートし、この方法getPCDataDB()を使用しようXpages:CacheBeanからデータベースにアクセスする方法

package com.scoular.cache; 

import java.io.Serializable; 
import java.util.HashMap; 
import java.util.Vector; 
import org.openntf.domino.utils.Factory; 
import org.openntf.domino.xsp.XspOpenLogUtil; 
import org.openntf.domino.Database; 
import org.openntf.domino.Session; 
import org.openntf.domino.View; 
import org.openntf.domino.ViewEntry; 
import org.openntf.domino.ViewNavigator; 

public class PCConfig implements Serializable { 

    private static final long serialVersionUID = 1L; 

    private static Database PCDataDB; 

    // @SuppressWarnings("unchecked") 
    private void initConfigData() { 
     try { 
      loadStatus(); 
      loadGeoLocations(); 
      loadModels(); 
      loadDatabases(); 
     } catch (Exception e) { 
      XspOpenLogUtil.logError(e); 
     } 
    } 

    public PCConfig() { 
     initConfigData(); 
    } 

    //Getters 

    public static Database getPCDataDB() { 
     return PCDataDB; 
    } 

    public static void setPCDataDB(Database dataDB) { 
     PCDataDB = dataDB; 
    } 

    public static void loadDatabases() { 
     loadPCDataDB();  
    } 

    public static void loadPCDataDB() { 
     Session session = Factory.getSession(); 
     PCConfig.PCDataDB = session.getDatabase(thisDB.getServer(),"scoApps\\PC\\PCData.nsf", false); 
    } 


    } 
} 

異なるJavaクラスの:

は、ここに私のcacheBeanの関連する部分です。 PCConfig.PCDataDBも試しました。

私はいつもエラーポインタの例外を受け取ります。

私は間違っていますか?

public void loadByUnid(String unid) { 
    try { 
     Document doc = PCConfig.getPCDataDB().getDocumentByUNID(unid); 
     if (null == doc) { 
      System.out.println("Document not found"); 
     } else { 
      loadValues(doc); 
     } 
    } catch (Exception e) { 
     XspOpenLogUtil.logError(e); 
    } 
} 

答えて

1

Knutによると、静的クラスにデータベースを格納することはできません。通常は、サーバーとデータベースパスを別々の変数として格納する必要があります。しかし、OpenNTF Domino APIを使用しているので、Database.getApiPath()を利用することができます。これは、 "metaReplicaID"(サーバー名とレプリカIDの組み合わせ)を返します。それを保存することができ、データベースがどこにあるかを直接参照することができます。その後、必要に応じてsession.getDatabase(metaReplicaID)を使用してデータベースを取得できます。

2

静的メソッドgetPCDataDB()を呼び出します。静的なので、クラスをインスタンス化する必要はありません。ただし、プライベートフィールドDatabase PCDataDBはこの時点では初期化されていません。これは、クラスをインスタンス化する場合にのみ発生します。だからあなたはnullポインタの例外を取得します。

PCConfigはマネージドBeanです。 SSJSで非静的メソッドを呼び出すと、自動的にインスタンス化されます。したがって、はあなたのクラスのすべてstaticを削除してもうまくいくはずです。あなたはJavaでクラスを使用したい場合は、getPCDataDB()を呼び出す前に、クラスをインスタンス化:

PCConfig pcConfig = new PCConfig(); 
    Document doc = pcConfig.getPCDataDB().getDocumentByUNID(unid); 

彼らが直列化可能でないと(自分のDatabase PCDataDBのような)クラスのフィールドとしてのDominoオブジェクトを維持することが推奨されていません。クラスオブジェクトがアプリケーションスコープのような長寿命スコープにある場合、それらは時間の経過とともにリサイクルされる可能性があります。データ自体をフィールドまたはケースデータベースのサーバー名とパスに保存して、必要なときにデータベースを再度開くことができます。

BTW private Database PCDataDBは、​​である必要があります。規約では、クラス名とインタフェースだけが大文字で始まるということです。

関連する問題