Как вы можете использовать SessionAsSigner в Java Bean, вызываемом из XPage?

Согласно Филиппу Рианду (см.: обсуждение openNTF), невозможно... Им нужно знать элемент дизайна, чтобы узнать, кто его подписал. Поэтому он доступен только в SSJS.


person John Dalsgaard    schedule 09.07.2012    source источник


Ответы (3)


Есть два известных мне способа использования объекта sessionAsSigner в Java-бинах:

1 Разрешив объект sessionAsSigner:

FacesContext context = FacesContext.getCurrentInstance();
Session sessionAsSigner = context.getApplication().getVariableResolver().
        resolveVariable(context, "sessionAsSigner");

2 С помощью функции getCurrentSessionAsSigner() из класса com.ibm.xsp.extlib.util.ExtLibUtil в библиотеке расширений.

Чтобы иметь возможность использовать его (как в Java, так и в SSJS), вы должны убедиться, что все элементы дизайна подписаны одним и тем же идентификатором пользователя. Если это не так, объект sessionAsSigner будет недоступен («не определен»).

person Mark Leusink    schedule 11.07.2012
comment
Ааа... интересно. Обычно я использую DominoUtils.getSession(), и в этом классе нет sessionAsSigner. Я не знал, что он существует в классе ExtLibUtil. Спасибо! - и да, я знаю, что вы должны подписывать все элементы с одним и тем же идентификатором, чтобы он работал ;-) - person John Dalsgaard; 16.07.2012

Я обнаружил, что решение находится прямо под рукой :-)

Я изменил свой XPage (в этом примере XAgent) на:

<xp:view xmlns:xp="http://www.ibm.com/xsp/core" rendered="false">

This is an xAgent returning json data...

<xp:this.afterRenderResponse><![CDATA[#{javascript:Controller.verify(sessionAsSigner)}]]></xp:this.afterRenderResponse>

and in the bean I simply used the session in the argument when I needed to open a database/document as signer. Sometimes the solution is so simple :-)

/Джон

person John Dalsgaard    schedule 09.07.2012
comment
Хороший небольшой пример принципов, известных как внедрение зависимостей. Любить это! - person stwissel; 10.07.2012
comment
Спасибо за предложение! В нашем случае одного подписанта гораздо сложнее поддерживать, чем одного певца... ;-) - person D.Bugger; 22.10.2020

Это довольно старый пост, на который я только что наткнулся. Пробовал некоторые из решений, упомянутых выше:

  1. resolveVariable не сработало для меня, по крайней мере, не для sessionAsSigner, так как это вызывает ошибку времени выполнения (хотя я могу разрешить старый добрый session...)

  2. честно говоря, я не совсем понял метод Controller.verify(sessionAsSigner); Является ли Controller чем-то специфичным для XAgents? Если да, то у меня здесь нет XAgent, поэтому я не могу его использовать.

  3. не хотелось импортировать сюда дополнительные классы ExtLib...

Поэтому я придумал еще одно решение, которое кажется очень простым:

создал метод в моем javaBean, который принимает объект сеанса в качестве аргумента; поскольку sessionAsSigner принадлежит к тому же классу, что и сеанс, мне не нужно импортировать что-то новое.

Джавакод это:

public void testSession(Session s) throws Exception{
        System.out.println(" > test effective user for this session = " 
             + s.getEffectiveUserName());
}

Это вызывается из SSJS либо как

mybean.testSession(session);

or

myBean.testSession(sessionAsSigner);

Может и другим помогает

person Lothar Mueller    schedule 04.09.2015
comment
это именно то, что я делаю... Мой bean-компонент называется Controller, и метод проверяется :-) - person John Dalsgaard; 04.09.2015
comment
Арх, я должен был подумать об этом; мой личный опыт работы с Java все еще нуждается в улучшении, знаете ли; на моем нынешнем этапе я способен думать только шаг за шагом: D - спасибо за указание - person Lothar Mueller; 04.09.2015