4

我正在将 Liferay 6.2 中的 JSF portlet 升级到 Liferay 7。

portlet 显示一个图标列表,并selectOneListbox用于控制这些图标的显示方式。

<h:selectOneListbox id="listModeSelector" value="#{user.listMode}" size="1">
    <f:selectItems value="#{user.listModes}" var="mode"
        itemLabel="#{mode.label}" itemValue="#{mode.value}" />
    <f:ajax event="change" execute="@this" render=":metricsPanel" />
</h:selectOneListbox>

user.setListMode更改 后调用时selectOneListbox,portlet 会将新选项保存到 portlet 首选项,并调用 bean 的 PortletPreferences'setValuestore函数:

@ManagedBean
@SessionScoped
public class User {
    private static final String LIST_MODE_KEY = "listMode";
    private ListMode listMode;
    private PortletPreferences preferences;

    public User() {
        PortletRequest request = ((PortletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest());
        preferences = request.getPreferences();
        listMode = ListMode.fromValue( preferences.getValue( LIST_MODE_KEY, ListMode.Normal.getValue() ) );
    }

    public String getListMode() {
        return listMode.getValue();
    }

    public ListMode[] getListModes() {
        return ListMode.values();
    }

    public void setListMode( String listModeValue ) {
        this.listMode = ListMode.fromValue( listModeValue );
        try { 
            preferences.setValue( LIST_MODE_KEY, listModeValue );
            preferences.store();
        }
        catch ( ...Exception e ) {
            log.error( "unable to persist listMode: " + e.getMessage(), e );
        }

    }

}

当他们更改此设置时,我们希望它为他们保持更改,以用于以后的任何会话。但是自从迁移到 Liferay 7 后,这样做会导致IllegalStateExceptionwith the message Preferences cannot be stored inside a render call

所以我的问题是:在 Liferay 7 JSF 中,有没有办法将PortletPreferences更改存储到像 a 这样的项目selectOneListbox,而不是提交表单?如果不是,那么正确的方法是什么?

4

1 回答 1

2

您应该始终使用当前请求的 portlet 首选项。当您使用会话 bean 的构造函数中的首选项时,通常首先从呈现请求调用,首选项仍然与(过时的)呈现请求相关联。

我的意思是这样的:

public void setListMode( String listModeValue ) {
    this.listMode = ListMode.fromValue( listModeValue );
    try { 
        PortletPreferences preferences = ((PortletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest()).getPreferences();
        preferences.setValue( LIST_MODE_KEY, listModeValue );
        preferences.store();
    }
    ...
}
于 2018-03-22T09:26:58.947 回答