0

我有一些只读 bean,它们不需要在回发时维护它们的状态。因此,这些 bean 可以在请求范围内,例如,

@Named
@RequestScoped
public class Bean extends LazyDataModel<Entity> {

    @Inject
    private Service service;
    private Entity entity; // Getter & setter.

    public Bean() {}

    @Override
    public List<Entity> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
        setRowCount(service.rowCount().intValue());
        return service.getList(first, pageSize);
    }
}

Entity作为查询字符串参数提供,该参数在模板客户端上定义如下。

<ui:define name="metaData">
    <f:metadata>
        <o:viewParam name="id" value="#{bean.entity}"/>
    </f:metadata>
</ui:define>

传递的参数id由一个自定义的隐式 JSF 转换器转换,标记为

@FacesConverter(forClass = Entity.class)

然而,这个 bean 仅出于一个原因需要转换为视图范围的 bean。母版页模板上有两个 global<p:selectOneMenu>代表语言列表和选定 PrimeFaces 主题列表。

当到达由上述请求范围托管 bean 支持的页面后更改语言或主题时,查询字符串参数id将明显丢失,除非该 bean 至少被指定为视图范围 bean。

使用 a 更改语言或主题<p:selectOneMenu>只是偶尔需要。应该以某种方式排除仅针对此功能的视图范围 bean。

当语言或主题在各自<p:selectOneMenu>的 s 中偶尔更改时,有没有办法以某种方式将此 bean 保持为请求范围的 bean,同时保留查询字符串参数?


额外的 :

这两个<p:selectOneMenu>由两个各自的会话范围 bean 支持。更改语言或主题的请求由<p:remoteCommand>.

最后的请求,在将发生的语言或主题设置为当前会话后重定向,如下所示。

public String themeAction() {
    themeBean.setTheme(Theme.valueOf(theme)); // Theme is an enum. theme is a request parameter which is supplied by a <p:remoteCommand>.
    return FacesContext.getCurrentInstance().getViewRoot().getViewId() + "?faces-redirect=true&includeViewParams=true";
}

当前 bean 是一个请求范围的 bean,它ThemeBean是一个会话范围的 bean,它已被注入到当前的请求范围的 bean 中。

4

0 回答 0