【问题标题】:Call to ActionResponse.setRenderParam is ignored / ineffective对 ActionResponse.setRenderParam 的调用被忽略/无效
【发布时间】:2013-08-25 02:51:49
【问题描述】:

我有一个 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 的参数映射在前两个调用中更新得很好,但不是最后一个。

= 乔 =

【问题讨论】:

    标签: jsf liferay portlet


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      实际的解决方法是在 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>
      

      然后在相关的&lt;portlet&gt;标签中我必须添加:

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

      为了清楚起见,我使用了“registrationToken”而不是令牌。完成后,我更新了 setRenderParam() 调用以使用密钥“registrationToken”而不是“token”,一切都开始按预期工作。

      【讨论】:

        猜你喜欢
        • 2022-09-28
        • 2011-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-15
        • 2013-04-24
        相关资源
        最近更新 更多