如何使用参数作为托管bean

时间:2016-09-18 19:25:36

标签: java xpages s

对于一个项目,我想使用Oliver Busse设置的UserBean:

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

我稍微改了一下,所以我也可以将它用于其他数据库,而不仅仅是当前的数据库。

我的大多数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来运行类吗?

2 个答案:

答案 0 :(得分:0)

再想一想你的bean。主要问题(IMO)对于不同的数据库是相同的bean - 任何代码都可以再次重新初始化bean,而您的页面,尤其是会话范围,可能/将会得到错误的结果。

对于您的方案,我强烈建议您在bean中实现MapDataObject。您可以使用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)