使用JSF selectOneListbox存储Liferay 7 portlet首选项

使用JSF selectOneListbox存储Liferay 7 portlet首选项,jsf,liferay,liferay-dxp,Jsf,Liferay,Liferay Dxp,我正在将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="#{mo

我正在将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>
当他们更改此设置时,我们希望其在以后的任何会话中保持更改状态。但由于移动到Liferay 7,这样做会导致出现
IllegalStateException
,消息为
首选项不能存储在渲染调用中


因此,我的问题是:在Liferay 7 JSF中,是否有一种方法可以存储对项目的更改(如
selectOneListbox
),而不是提交表单?如果没有,正确的方法是什么?

您应该始终使用当前请求的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();
    }
    ...
}

你能加一点代码吗?我的意思是,如何将bean绑定到
selectOneListbox
?我也在Liferay 7上运行JSF,在portlet的操作调用中仍然调用呈现响应阶段之前的所有内容。
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();
    }
    ...
}