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

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

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 будет недоступен ("неопределенный").

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

Я изменил свой 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>

и в бине я просто использовал сеанс в аргументе, когда мне нужно было открыть базу данных / документ в качестве подписавшего. Иногда решение так просто:-)

/ John

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

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

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

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

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

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

Javacode это:

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

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

mybean.testSession(session);

или же

myBean.testSession(sessionAsSigner);

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

Другие вопросы по тегам