Как вы можете использовать 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
Это довольно старый пост, на который я только что наткнулся. Пробовал некоторые решения, упомянутые выше:
resolveVariable
не работал для меня, по крайней мере, не дляsessionAsSigner
как это выдает ошибку времени выполнения (я могу разрешить просто старыйsession
, хоть...)честно говоря, я не совсем понял метод Controller.verify(sessionAsSigner); Контроллер является чем-то конкретным для XAgents? Если так, у меня нет XAgent здесь, поэтому я не могу его использовать
не хотелось импортировать здесь дополнительные классы 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);
Может тоже помогает другим