2013-08-25 60 views
0

我有具有类似于下面的代码的Liferay JSF 2.0的portlet:电话ActionResponse.setRenderParam被忽略/无效

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的调试器中跟踪这段代码,并检查ActionResponse实例的_publicRenderParameters HashMap的内容,我发现userId和org params已经设置好了。在接下来的几行中,我看到registrationToken具有正确提交的隐藏输入值,并且正在进行最后的setRenderParameter()调用。

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

我试过多种方式,使其工作,从传送令牌经过我们用于持有其他PARAMS一个会话范围豆;稍后在代码流中调用setRenderParameter()(仍然使用相同的ActionResponse引用);在呼叫中使用不同的密钥名称(“registrationToken”),以防万一“标记”是某种保留名称或某种内容。没有任何东西获得最后一次实际更新地图的呼叫。

我也用谷歌搜索相关的方面,我能想到的每一个组合,但还没有找到这样的具体问题任何事情。

有没有其他人遇到这个问题?为什么ActionResponse的param地图在前两次调用中会更新,但不是最后一次调用。

=乔=

回答

1

如果你想开发的Portlet的登录类型,那么你可能想看看jsf2-login-portlet演示。

0

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

实际修复是增加一个公共呈现PARAM定义在portlet.xml,然后进行新的公共呈现在上面的portlet支持PARAM与序列中下一个沿。

<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”,并且所有事情都按预期工作。