2013-08-25 58 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」,並且所有事情都按預期工作。