2016-04-29 76 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应该是​​。惯例是只有类名和接口以大写字母开头。