Согласно Филиппу Рианду (см.: обсуждение openNTF), невозможно... Им нужно знать элемент дизайна, чтобы узнать, кто его подписал. Поэтому он доступен только в SSJS.
Как вы можете использовать SessionAsSigner в Java Bean, вызываемом из XPage?
Ответы (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>
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 :-)
/Джон
Это довольно старый пост, на который я только что наткнулся. Пробовал некоторые из решений, упомянутых выше:
resolveVariable
не сработало для меня, по крайней мере, не дляsessionAsSigner
, так как это вызывает ошибку времени выполнения (хотя я могу разрешить старый добрыйsession
...)честно говоря, я не совсем понял метод Controller.verify(sessionAsSigner); Является ли Controller чем-то специфичным для XAgents? Если да, то у меня здесь нет XAgent, поэтому я не могу его использовать.
не хотелось импортировать сюда дополнительные классы 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);
Может и другим помогает