对ActionResponse.setRenderParam的调用被忽略/无效

时间:2013-08-25 02:51:49

标签: jsf liferay portlet

我有一个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绝对没有更新,并且该标记在params中固执地保持未设置状态。

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

我也用Google搜索了我能想到的相关术语的所有组合,但没有找到类似这个特定问题的任何内容。

还有其他人遇到过这个问题吗?我的智慧结束了为什么ActionResponse的param地图在前两次调用时更新了,但不是最后一次调用。

= Joe =

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

实际修复是在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”,一切都开始按预期工作。