2016-04-29 3 views
1

У меня есть cacheBean с именем PCConfig, в котором я хочу хранить ссылки на базы данных, поэтому я могу получить к ним доступ в других методах 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.

Я всегда получаю исключение ошибки 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); 
    } 
} 

ответ

1

Как говорит Кнут, хранение базы данных в статическом классе не будет работать. Обычно вам необходимо сохранить сервер и путь базы данных в виде отдельных переменных. Но поскольку вы используете OpenNTF Domino API, вы можете воспользоваться Database.getApiPath(), который возвращает «metaReplicaID» - комбинацию имени сервера и идентификатора реплики. Вы можете сохранить это, и у вас есть прямая ссылка на то, где находится база данных. Затем вы можете использовать session.getDatabase(metaReplicaID) для извлечения базы данных по мере необходимости.

2

Вы вызываете статический метод getPCDataDB(). Поскольку это статично, вам не нужно создавать экземпляр класса. Но ваше частное поле Database PCDataDB не инициализируется на этом этапе. Это происходит только в том случае, если вы создаете экземпляр класса. Вот почему вы получаете исключение нулевого указателя.

Я думаю, PCConfig - управляемый боб. Он будет автоматически создаваться, если вы вызовете нестатический метод в SSJS. Итак, удалить все static в вашем классе и это должно сработать. Если вы хотите использовать класс в Java, то экземпляр класса перед вызовом getPCDataDB():

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

Не рекомендуется хранить объекты Domino в качестве полей класса (как ваш Database PCDataDB), поскольку они не являются сериализации. Они могут быть переработаны в течение времени, особенно если объект класса находится в длительной перспективе, такой как область приложения. Лучше хранить данные непосредственно в полях или в имени и пути сервера базы данных вашего случая, чтобы вы могли снова открыть базу данных, когда вам это нужно.

BTW private Database PCDataDB должно быть private Database pCDataDB. Соглашение состоит в том, что только имена классов и интерфейсы начинаются с заглавной буквы.

Смежные вопросы