2016-07-19 13 views
0

Java Managed Cache Beanを作成しました。このBeanの使い方の1つは、アプリの他の部分でさまざまなデータベースを設定できるようにすることです。私のテンプレートは他のアプリケーションでも使用されるので、キャッシュBeanの1つの場所でデータデータベースのパスを設定することができます(私のプログラミングは1つのアプリケーションにあり、データは別のアプリケーションにあります)それは私のアプリを介して。他のJavaクラスの管理対象CacheBeanへのアクセス

私の解決策はうまくいくようですが、これが問題に近づく最善の方法かどうか疑問です。

私の顔-コンフィグは次のとおりです。

<?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> 

私はCacheBeanおよびその他のJavaクラスの両方を下にペアリングしているので、唯一の関連するクラスが表示さ:

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

} 

をと他のJavaクラスは次のとおりです。

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

どのような提案も大歓迎です。

答えて

1

BeanをJSFエンジンから「可変」として取得できます。ここで見てください:https://www.mindoo.com/web/blog.nsf/dx/18.07.2009191738KLENAL.htm?opendocument&comments

単にバインドされた値のためのヘルパークラスを呼び出すと、使用するELに基づいて、オブジェクト参照または何らかのメソッドの戻り値が得られます。

更新、実際の質問逃した:

を私のソリューションは、動作しているようですが、これは アプローチの問題に対する最善の方法であるのだろうか。

はい、これが最適な選択肢だと思います。

+0

ありがとうFrantisek。あなたの最初の答えは私を混乱させました。私はこれがうまくいくことをうれしく思っています。 –

関連する問題