2016-09-18 101 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字段(如果它为空)(因为在解序列化后它将为空)