2016-09-18 7 views
0

Для проекта я хотел бы использовать UserBean установить Оливер Буссе:как запустить UserBean класса с параметрами, управляемого компонента

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

я изменил его немного, поэтому я также использовать его для других баз данных, а не только для текущей базы данных.

Большая часть моего боба из исходного кода, хотя я сделал некоторые дополнения, чтобы захватить пользователь аКЛ 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> 

Здесь как я инициирую фасоль:

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

Я замечаю, что я могу использовать только компонент с областью сеанса и запроса. Область просмотра дает ошибку 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; 

Я получаю правильную информацию о пользователе возвратили.

Может кто-нибудь светить, как я могу снова запустить класс с параметрами в качестве управляемого компонента?

+0

Еще одна мысль: ваш фрагмент кода добавляет привилегии для список, но id не заботится об их удалении. Это возможная причина, по которой вы получаете неправильный ACL, когда ваш код работает с двумя разными dbs или пользователями. –

+0

Вы можете получить доступ к объекту домино через контекст лиц, например, http://naveegator.blogspot.ch/2011/12/accessing-xpages-global-objects-in-java.html – umeli

ответ

0

Еще раз подумайте о своей фасоли. Основная проблема (IMO) является одним и тем же компонентом для разных баз данных - любой код может снова инициализировать компонент, а ваша страница, особенно с областью сеанса, может/будет ошибочной.

Для вашего сценария я настоятельно рекомендую реализовать Map или DataObject в вашем компоненте. Вы можете связываться с EL и получать правильный ACL для разных баз данных. Вместо метода init (db) вы можете реализовать метод get(key)/getValue(key), который вернет POJO с ACL-свойствами.

Образец связывания: ${Bean['apps/quintessens/comments2.nsf'].aclPrivileges}.

Подробнее here.

P.S: Никогда не используйте объект Domino (база данных в вашем случае) в качестве атрибута bean (единственного исключения из списка).

0

Мое предположение по причине того, что вы получаете ошибку 500 на viewcope, может быть из-за использования NotesObject в качестве поля в вашем компоненте.

public Database db; 

Диссертации объекты не сериализации и бросить NotSerializable исключение в View Scope (если вы используете на диске упорства).

Область приложения, сеанса и запроса не сериализована, поэтому вы, вероятно, не увидите эту ошибку в этих областях.

Вместо хранения db на bean-компоненте вы можете сохранить либо путь к файлу, либо идентификатор реплики. Отметьте поле БД «переходный», это говорит о том, что процесс сериализации игнорирует это поле. затем создайте ленивый метод загрузки getDb(), который будет повторно инициализировать поле db, если оно равно null (потому что оно будет нулевым после его де-сериализации).