Вызов ActionResponse.setRenderParam игнорируется/неэффективен

У меня есть портлет Liferay JSF 2.0 со следующим кодом:

private String userId
private String organization
private String registrationToken

...

public String submitLogin() {
    ActionResponse actionResponse = (ActionResponse) PortletUtil.getExternalContext().getResponse();
    actionResponse.setRenderParameter("userId", this.userId);
    actionResponse.setRenderParameter("org", this.organization);

    if ( StringUtils.hasText(this.registrationToken) )
        actionResponse.setRenderParameter("token", this.registrationToken);

    ...
}

Все частные переменные-члены сопоставляются с полями формы ввода и имеют соответствующие геттеры и сеттеры.

Если я отследю этот код в отладчике Eclipse и изучу содержимое _publicRenderParameters HashMap экземпляра ActionResponse, я увижу, что параметры userId и org были установлены просто отлично. Переходя по следующим строкам, я вижу, что RegistrationToken имеет правильное отправленное скрытое входное значение, и выполняется последний вызов setRenderParameter().

Вот часть Bizarro World: после этого последнего вызова setRenderParameter() абсолютно не обновляется хэш-карта _publicRenderParameters HashMap в ActionResponse, и токен упорно остается неустановленным в параметрах.

Я пробовал несколько способов заставить его работать: от передачи токена через bean-компонент с областью сеанса, который мы использовали для хранения других параметров; к вызову setRenderParameter() позже в потоке кода (все еще с использованием той же ссылки ActionResponse); использовать другое имя ключа ("registrationToken") при вызове, на тот случай, если "токен" был каким-то зарезервированным именем или чем-то подобным. Ничто не получило этот последний звонок, чтобы фактически обновить карту.

Я также искал в Google все комбинации соответствующих терминов, которые только мог придумать, но не нашел ничего похожего на эту конкретную проблему.

Кто-нибудь еще столкнулся с этой проблемой? Я не понимаю, почему карта параметров ActionResponse отлично обновляется при первых двух вызовах, но не при последнем.

= Джо =


person JLMoran    schedule 25.08.2013    source источник


Ответы (2)


Если вы пытаетесь разработать портлет для входа в систему, возможно, вам стоит взглянуть на jsf2-login-portlet.

person Neil Griffin    schedule 26.08.2013

Сегодня утром связался с одним из членов моей команды, он сразу увидел проблему. Обратите внимание, что во время отладки я видел идентификатор пользователя и значения организации, установленные в карте ActionResponse _public_render_params. На самом деле это был ключ. Мое значение токена устанавливалось, но я искал не ту переменную-член. Значение было задано как частный параметр рендеринга в карте _params ActionResponse.

Фактическое исправление состояло в том, чтобы добавить определение общедоступного параметра вывода в portlet.xml, а затем сделать этот новый общедоступный параметр вывода поддерживаемым в приведенном выше портлете вместе со следующим в последовательности.

Под тегом <portlet-app> мне нужно было:

<public-render-parameter>
    <identifier>registrationToken</identifier>
    <qname xmlns:x="http://liferay.com/pub-renderparams">x:registrationToken</qname>
</public-render-parameter>

Затем в соответствующем теге <portlet> мне пришлось добавить:

<supported-public-render-parameter>registrationToken</supported-public-render-parameter>

Я использовал «registrationToken», а не токен, просто для ясности. Как только это было сделано, я обновил вызов setRenderParam(), чтобы использовать ключ «registrationToken» вместо «token», и все заработало, как и ожидалось.

person JLMoran    schedule 26.08.2013