2016-04-29 105 views
1

我有一個名爲PCConfig的cacheBean,我想在其中存儲對數據庫的引用,所以我可以在其他Java方法中訪問它們。Xpages:如何從CacheBean訪問數據庫

這裏是我的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類,我導入PCConfig類,並嘗試使用這種方法getPCDataDB()。我也嘗試過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此時尚未初始化。這隻會發生,如果你實例化類。這就是爲什麼你得到空指針異常。

我猜PCConfig是一個託管的bean。如果您在SSJS中調用非靜態方法,它會自動實例化。所以,刪除所有static在你的班級,它應該工作。如果你想使用Java中的類,然後調用getPCDataDB()之前實例化類:

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

不建議保持Domino對象爲類字段(如您的Database PCDataDB),因爲它們不是序列化。他們可能會在一段時間內被回收,特別是如果類對象駐留在應用程序作用域這樣的長期生命週期中。最好將數據保存在字段或案例數據庫的服務器名稱和路徑中,以便在需要時再次打開數據庫。

BTW private Database PCDataDB應該是​​。慣例是隻有類名和接口以大寫字母開頭。