2016-09-18 82 views
0

帶參數運行UserBean類對於一個項目,我想使用的UserBean成立了由奧利弗·布斯:如何爲託管bean

http://oliverbusse.notesx.net/Privat/osnippets.nsf/%24%24OpenDominoDocument.xsp?documentId=90035C4B1B5984C0C1257B5000625C25&action=openDocument

我已經改變了一點,所以我也可以用它對於其他數據庫,不僅僅是當前的數據庫。

大多數我的bean的是從原來的代碼,雖然我做了一些補充,捕獲用戶的ACL特權時太:

int accPriv = thisDb.queryAccessPrivileges(session.getEffectiveUserName()); 

if ((accPriv & thisDb.DBACL_CREATE_DOCS) > 0) { 
    if (!aclPriviliges.contains("DBACL_CREATE_DOCS")) { 
     aclPriviliges.add("DBACL_CREATE_DOCS"); 
    } 
} 
if ((accPriv & thisDb.DBACL_DELETE_DOCS) > 0) { 
    if (!aclPriviliges.contains("DBACL_DELETE_DOCS")) { 
     aclPriviliges.add("DBACL_DELETE_DOCS"); 
    } 
} 
if ((accPriv & thisDb.DBACL_CREATE_PRIV_AGENTS) > 0) { 
    if (!aclPriviliges.contains("DBACL_CREATE_PRIV_AGENTS")) { 
     aclPriviliges.add("DBACL_CREATE_PRIV_AGENTS"); 
    } 
} //etc... 

的面孔,配置:

<managed-bean> 
    <managed-bean-name>UserBean</managed-bean-name> 
    <managed-bean-class>org.quintessens.comments.utils.UserBean 
     </managed-bean-class> 
    <managed-bean-scope>session</managed-bean-scope> 
    </managed-bean> 

這裏我是如何發起這個豆的:

<xp:this.beforePageLoad><![CDATA[#{javascript:var db:NotesDatabase = session.getDatabase("","apps/quintessens/comments.nsf"); 
UserBean.init(db);}]]></xp:this.beforePageLoad> 

我注意到我只能使用會話和請求範圍的bean。查看範圍給出500錯誤。

UserBean類本身大多以原文:

一些修改:

public Database db; 

    public UserBean() { 
     this.init(db); 
    } 

public void init(Database db) { 
     session = getCurrentSession(); 
     try { 
      Database thisDb = db; 
... 
int accPriv = thisDb.queryAccessPrivileges(session.getEffectiveUserName()); 
... 
} 

雖然我沒有得到與會話和請求範圍的誤差, ACL用戶特權不正確。

如果我運行的類沒有管Bean如下:

var thisDb:NotesDatabase = session.getDatabase("","apps/quintessens/comments2.nsf"); 
Bean = new org.quintessens.comments.utils.UserBean(thisDb); 
return Bean.aclPriviliges; 

我得到返回的正確的用戶信息。

有人可以照亮我如何使用參數再次作爲託管bean運行該類?

+0

還有一個想法:您的代碼片段爲列表,但id不關心刪除它們。當您的代碼運行在兩個不同的dbs或用戶上時,這可能是您獲取錯誤ACL的原因。 –

+0

您可以通過faces上下文訪問多米諾骨牌對象,請參閱http://naveegator.blogspot.ch/2011/12/accessing-xpages-global-objects-in-java.html – umeli

回答

0

再想一想你的豆。主要問題(IMO)對於不同的數據庫是相同的bean - 任何代碼都可以重新初始化bean,並且頁面(特別是會話範圍)可能會/會得到錯誤的結果。

對於您的情況,我強烈建議在您的bean中實施MapDataObject。您可以與EL綁定併爲不同的數據庫獲取適當的ACL。而不是init(db)方法,你可以實現get(key)/getValue(key)方法,它會返回帶有ACL屬性的POJO。

樣品結合:${Bean['apps/quintessens/comments2.nsf'].aclPrivileges}

更多信息here。 P:永遠不要使用Domino對象(在你的情況下是數據庫)作爲bean屬性(唯一的異常 - 請求作用域bean)。

0

我的猜測是你在viewcope上得到錯誤500的原因可能是因爲在你的bean中使用NotesObject作爲字段。

public Database db; 

論文對象不能序列化,將扔在查看Scope的NotSerializable異常(如果您正在使用磁盤上的持久性)。

應用程序,會話和請求範圍未被序列化,因此您可能不會在這些範圍下看到該錯誤。

不是將數據庫存儲在bean上,而是可以存儲文件路徑或副本標識。 標記你的DB字段爲'transient',這告訴序列化過程忽略該字段。 然後創建一個延遲加載的getDb()方法,它將重新初始化db字段(如果它爲空)(因爲在解序列化後它將爲空)