0

我有一个 Liferay JSF 2.0 portlet,其代码如下:

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);

    ...
}

所有私有成员变量都映射到输入表单字段并具有适当的 getter 和 setter。

如果我在 Eclipse 的调试器中跟踪此代码并检查 ActionResponse 实例的 _publicRenderParameters HashMap 的内容,我会发现 userId 和 org 参数设置得很好。遍历下一行,我看到 registrationToken 具有正确提交的隐藏输入值,并且正在进行最后一次 setRenderParameter() 调用。

这是 Bizarro World 部分:在最后一次 setRenderParameter() 调用之后,ActionResponse 中的 _publicRenderParameters HashMap 绝对没有更新,并且令牌在参数中顽固地保持未设置。

我尝试了多种方法来使其工作,从将令牌传递给我们用于保存其他参数的会话范围的 bean;稍后在代码流中调用 setRenderParameter() (仍然使用相同的 ActionResponse 引用);在通话中使用不同的密钥名称(“registrationToken”),以防“token”是某种保留名称或其他东西。没有人得到最后一次调用来实际更新地图。

我还用谷歌搜索了我能想到的所有相关术语的组合,但没有找到类似这个特定问题的任何东西。

有没有其他人遇到过这个问题?我不知道为什么 ActionResponse 的参数映射在前两个调用中更新得很好,但不是最后一个。

=乔=

4

2 回答 2

1

如果您正在尝试开发登录类型的 portlet,那么您可能需要查看jsf2-login-portlet演示。

于 2013-08-26T10:25:01.033 回答
0

今天早上联系了我的一位团队成员,他立即发现了问题。请注意,当我调试时,我看到在 ActionResponse 的 _public_render_params 映射中设置了用户 ID 和组织值。这实际上是关键。正在设置我的令牌值,但我正在查看错误的成员变量。该值在 ActionResponse 的 _params 映射中设置为私有渲染参数。

实际的解决方法是在 portlet.xml 中添加一个公共渲染参数定义,然后使上述 portlet 支持新的公共渲染参数以及序列中的下一个。

<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”,一切都开始按预期工作。

于 2013-08-26T15:41:52.553 回答