对于一个项目,我想使用Oliver Busse设置的UserBean:
我稍微改了一下,所以我也可以将它用于其他数据库,而不仅仅是当前的数据库。
我的大多数bean来自原始代码,虽然我做了一些补充来捕获用户acl priviliges:
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>
以下是我启动bean的方法:
<xp:this.beforePageLoad><![CDATA[#{javascript:var db:NotesDatabase = session.getDatabase("","apps/quintessens/comments.nsf");
UserBean.init(db);}]]></xp:this.beforePageLoad>
我注意到我只能将bean与session和request范围一起使用。查看范围给出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用户权限不正确。
如果我按照以下方式运行该类而不是Managed Bean:
var thisDb:NotesDatabase = session.getDatabase("","apps/quintessens/comments2.nsf");
Bean = new org.quintessens.comments.utils.UserBean(thisDb);
return Bean.aclPriviliges;
我收到了正确的用户信息。
有人可以说明如何再次使用参数作为托管bean来运行类吗?
答案 0 :(得分:0)
再想一想你的bean。主要问题(IMO)对于不同的数据库是相同的bean - 任何代码都可以再次重新初始化bean,而您的页面,尤其是会话范围,可能/将会得到错误的结果。
对于您的方案,我强烈建议您在bean中实现Map
或DataObject
。您可以使用EL绑定并为不同的数据库获取正确的ACL。您可以实现get(key)/getValue(key)
方法而不是init(db)方法,该方法将返回具有ACL属性的POJO。
样本绑定:${Bean['apps/quintessens/comments2.nsf'].aclPrivileges}
。
更多信息here。
P.S:永远不要使用Domino对象(在你的情况下是数据库)作为bean属性(唯一的例外 - 请求范围的bean)。
答案 1 :(得分:0)
我猜测你在viewscope上获得错误500的原因可能是因为在你的bean中使用了一个NotesObject作为字段。
public Database db;
这些对象不可序列化,并且会在View Scope中抛出NotSerializable异常(如果您正在使用磁盘持久性)。
应用程序,会话和请求范围未序列化,因此您可能无法在这些范围内看到该错误。
您可以存储文件路径或副本ID,而不是将数据库存储在bean上。 标记DB字段&#39; transient&#39;,这告诉序列化过程忽略该字段。 然后创建一个延迟加载的getDb()方法,如果它为null,将重新初始化db字段(因为它在反序列化后将为null)