Xpages:如何从CacheBean访问数据库
我有一个名为PCConfig的cacheBean,我想在其中存储对数据库的引用,这样我就可以用其他Java方法访问它们 以下是我的cacheBean的相关部分:Xpages:如何从CacheBean访问数据库,xpages,javabeans,Xpages,Javabeans,我有一个名为PCConfig的cacheBean,我想在其中存储对数据库的引用,这样我就可以用其他Java方法访问它们 以下是我的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.d
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
我总是得到错误null指针异常
我做错了什么
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);
}
}
您可以调用静态方法
getPCDataDB()
。因为它是静态的,所以不需要实例化该类。但是,您的私有字段数据库PCDataDB
此时未初始化。只有在实例化该类时才会发生这种情况。这就是为什么会出现空指针异常
我猜PCConfig
是一个托管bean。如果在SSJS中调用非静态方法,它将自动实例化。因此,删除类中的所有静态,它应该可以工作。如果要在Java中使用该类,请在调用getPCDataDB()
之前实例化该类:
不建议将Domino对象保留为类字段(如数据库PCDataDB
),因为它们不可序列化。随着时间的推移,它们可能会被回收利用,特别是当类对象驻留在一个像应用程序作用域这样的长期作用域中时。最好将数据本身保存在字段或案例数据库的服务器名称和路径中,以便在需要时再次打开数据库
顺便说一句,私有数据库PCDataDB
应该是私有数据库PCDataDB
。惯例是只有类名和接口以大写字母开头。正如Knut所说,将数据库存储在静态类中是行不通的。通常,您需要将服务器和数据库路径存储为单独的变量。但是,由于您使用的是OpenNTF Domino API,因此可以利用Database.getApiPath()
,它返回一个“metaReplicaID”——服务器名和副本ID的组合。您可以存储它,并直接引用数据库所在的位置。然后,您可以在需要时使用session.getDatabase(metaReplicaID)
检索数据库
PCConfig pcConfig = new PCConfig();
Document doc = pcConfig.getPCDataDB().getDocumentByUNID(unid);