2016-07-19 20 views
0

Ich habe eine Java Managed Cache-Bean geschrieben. Eine der Anwendungen dieser Bean besteht darin, anderen Teilen meiner App das Einrichten verschiedener Datenbanken zu erlauben. Meine Vorlage wird von anderen Apps verwendet, daher möchte ich den Pfad der Daten-Datenbank (meine Programmierung ist in einer App und meine Daten in einer anderen) an einer Stelle im Cache-Bean einstellen und dann verwenden können es durch meine App.Auf einen verwalteten CacheBean in anderen Java-Klassen zugreifen

Meine Lösung scheint zu funktionieren, aber ich frage mich, ob dies der beste Weg ist, um das Problem anzugehen.

My Faces-Konfig ist:

<?xml version="1.0" encoding="UTF-8"?> 
<faces-config> 
    <managed-bean> 
    <managed-bean-name>CacheBean</managed-bean-name> 
    <managed-bean-class>com.scoular.cache.CacheBean</managed-bean-class> 
    <managed-bean-scope>application</managed-bean-scope> 
    </managed-bean> 
</faces-config> 

Ich habe sowohl die CacheBean gepaart nach unten und der anderen Java-Klasse, so dass nur die relevanten Klassen zeigen:

CacheBean:

package com.xxxx.cache; 

import java.io.Serializable; 
import java.util.HashMap; 
import java.util.Vector; 
import javax.faces.context.FacesContext; 

public class CacheBean implements Serializable { 

    // Constants 
    private static final String BEAN_NAME = "CacheBean"; 

    private static final long serialVersionUID = -2665922853615670023L; 

    private String serverPath; 
    private String pcAppDBpathJava; 

    public static CacheBean getCurrentInstance() { 

     // This is a neat way to get a handle on the instance of this bean in the scope from other Java code... 
     FacesContext context = FacesContext.getCurrentInstance(); 
     return (CacheBean) context.getApplication().getVariableResolver().resolveVariable(context, BEAN_NAME); 
    } 

    public CacheBean() throws NotesException, Exception { 
     loadDBPaths(); 
    } 

    public void loadDBPaths() { 
     Session session = Factory.getSession(); 
     Database tmpDB = session.getCurrentDatabase(); 
     String tmpStr = tmpDB.getServer(); 
     pcAppDBpathJava = tmpStr + "!!" + "scoApps\\PC\\PCApp.nsf"; 
    } 

    public String getServerPath() { 
     Session session = Factory.getSession(); 
     Database tmpDB = session.getCurrentDatabase(); 
     serverPath = tmpDB.getServer(); 
     return serverPath; 
    } 

    public void setServerPath(String serverPath) { 
     this.serverPath = serverPath; 
    } 

    public String getPcAppDBpathJava() { 
     return pcAppDBpathJava; 
    } 

    public void setPcAppDBpathJava(String pcAppDBpathJava) { 
     this.pcAppDBpathJava = pcAppDBpathJava; 
    } 

} 

Und die andere Java-Klasse lautet:

package com.xxxx.model; 

import java.io.Serializable; 
import java.util.Date; 
import java.util.HashMap; 
import javax.faces.context.FacesContext; 
import org.openntf.domino.*; 
import org.openntf.domino.utils.Factory; 
import org.openntf.domino.xsp.XspOpenLogUtil; 
import com.scoular.cache.CacheBean; 

public class PC implements Serializable { 

    private static final long serialVersionUID = -928898373594997220L; 

    @SuppressWarnings("unused") 
    private Database appData; 

    public PC() { 
    } 

    public void loadByUnid(String unid) { 
     try { 

      Database PCDataDB = this.getAppData(); 
      Document doc = PCDataDB.getDocumentByUNID(unid); 
      if (null == doc) { 
       System.out.println("Document not found"); 
      } else { 
       loadValues(doc); 
      } 
     } catch (Exception e) { 
      XspOpenLogUtil.logError(e); 
     } 
    } 

    public Database getAppData() { 
     CacheBean cache = CacheBean.getCurrentInstance(); 
     Session session = Factory.getSession();   
      Database PCDataDB = session.getDatabase(cache.getPcDataDBpathJava()); 
     return PCDataDB; 
    } 

    public void setAppData(Database appData) { 
     this.appData = appData; 
    } 
} 

Alle Vorschläge würden sehr geschätzt werden.

Antwort

1

Sie können Ihre Bean als "Variable" von JSF-Engine erhalten. Werfen Sie einen Blick hier: https://www.mindoo.com/web/blog.nsf/dx/18.07.2009191738KLENAL.htm?opendocument&comments

Rufen Sie einfach Helper-Klasse für gebundenen Wert und Sie erhalten entweder Objektreferenz oder Rückgabewert einer Methode - basierend auf EL Sie verwenden.

Update verpasst eigentliche Frage:

Meine Lösung scheint zu funktionieren, aber ich frage mich, ob dies der beste Weg, um ist das Problem angehen.

Ja, ich denke, das ist die beste Option.

+0

Danke Frantisek. Deine erste Antwort hat mich verwirrt. Ich bin froh, dass das funktioniert. –