使用 JSF selectOneListbox 存储 Liferay 7 portlet 首选项
Storing a Liferay 7 portlet preference using a JSF selectOneListbox
我正在将 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' setValue
和 store
函数:
@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 后,这样做会导致 IllegalStateException
和消息 Preferences cannot be stored inside a render call
。
所以我的问题是:在 Liferay 7 JSF 中,有没有一种方法可以存储 PortletPreferences
从对 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();
}
...
}
我正在将 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' setValue
和 store
函数:
@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 后,这样做会导致 IllegalStateException
和消息 Preferences cannot be stored inside a render call
。
所以我的问题是:在 Liferay 7 JSF 中,有没有一种方法可以存储 PortletPreferences
从对 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();
}
...
}