我有一个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 =
答案 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”,一切都开始按预期工作。