2016-04-29 5 views
1

Ich habe einen CacheBean namens PCConfig, in dem ich Verweise auf Datenbanken speichern möchte, damit ich auf sie in anderen Java-Methoden zugreifen kann.Xpages: Wie man von CacheBean auf die Datenbank zugreift

Hier ist der relevante Teil meiner 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); 
    } 


    } 
} 

In einer anderen Java-Klasse importieren ich die PCKonfig Klasse und versuchen, diese Methode zu verwenden getPCDataDB(). Ich habe auch PCConfig.PCDataDB ausprobiert.

Ich bekomme immer die Fehler Nullzeiger Ausnahme.

Was mache ich falsch?

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); 
    } 
} 

Antwort

1

Wie Knut sagt, wird das Speichern der Datenbank in Ihrer statischen Klasse nicht funktionieren. Normalerweise müssten Sie den Server und den Datenbankpfad als separate Variablen speichern. Da Sie jedoch die OpenNTF Domino-API verwenden, können Sie die Database.getApiPath() nutzen, die eine "MetaReplicaID" - eine Kombination aus Servername und Replikat-ID - zurückgibt. Sie können das speichern und haben einen direkten Verweis auf den Speicherort der Datenbank. Sie können dann session.getDatabase(metaReplicaID) verwenden, um die Datenbank bei Bedarf abzurufen.

2

Sie rufen die statische Methode getPCDataDB(). Da es statisch ist, müssen Sie die Klasse nicht instanziieren. Aber Ihr privates Feld Database PCDataDB ist zu diesem Zeitpunkt nicht initialisiert. Dies geschieht nur, wenn Sie die Klasse instanziieren. Deshalb erhalten Sie die Nullzeiger-Ausnahme.

Ich denke, PCConfig ist eine verwaltete Bean. Es wird automatisch instanziiert, wenn Sie in SSJS eine nicht statische Methode aufrufen. Also, entfernen alle static in Ihrer Klasse und es sollte funktionieren. Wenn Sie die Klasse verwenden möchten instanziieren die Klasse in Java dann vor dem Aufruf getPCDataDB():

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

Es wird empfohlen, nicht zu halten Domino-Objekte als Klassenfelder (wie Ihre Database PCDataDB), da sie nicht serialisierbar sind. Sie können im Laufe der Zeit wiederverwendet werden, insbesondere wenn das Klassenobjekt wie der Anwendungsbereich in einem langen Lebensbereich liegt. Es ist besser, die Daten selbst in Feldern oder im Servernamen und Pfad der Falldatenbank zu behalten, damit Sie die Datenbank bei Bedarf wieder öffnen können.

BTW private Database PCDataDB sollte private Database pCDataDB sein. Die Konvention ist, dass nur Klassennamen und Schnittstellen mit einem Großbuchstaben beginnen.