【问题标题】:GET parameters not being passed to ViewScoped ManagedBeanGET 参数未传递给 ViewScoped ManagedBean
【发布时间】:2013-06-13 20:56:44
【问题描述】:

我有一个p:dataTable 和一个p:contextMenu 和一些p:menuitems。这些菜单项中的一个应将 id 传递给另一个视图,该视图的读取方式类似于 here 中指出的那样。

问题是转换器会抛出所需的消息,就像没有发送 id 一样 - 看起来确实不是。我想我错过了一些基本的东西,但我真的想不通。代码如下:

源视图

<h:form id="formTabela">
    <p:fieldset>
        <p:dataTable id="sistemas"
                     selection="#{sistemaMb.sistemaSelecionado}">
            (...)
        </p:dataTable>
    </p:fieldset>

    <p:contextMenu for="sistemas">
        <p:menuitem value="Gerenciar módulos" icon="ui-icon-search" 
                    action="modulos?faces-redirect=true&amp;includeViewParams=true"
                    ajax="false">  
            <f:param name="id" value="#{sistemaMb.sistemaSelecionado.id}"/>
        </p:menuitem>

        (More items...)
    </p:contextMenu>

    (Some dialogs...)
</h:form>

目标视图(模数)

<!-- This is on body: -->
<ui:define name="metadata">
    <f:metadata>
        <f:viewParam name="id" value="#{moduloMb.sistema}" 
                     converterMessage="foo"
                     required="true" 
                     requiredMessage="bar"/>

        <f:event type="preRenderView" listener="#{moduloMb.init()}" />
    </f:metadata>
</ui:define>

目标视图托管 bean

@ManagedBean
@ViewScoped
public class ModuloMb implements Serializable {
    private Sistema sistema;

    @PostConstruct
    public void init() {
        if (!Faces.isPostback() && !Faces.isValidationFailed()) {
            // business stuff, but "sistema" is always null.
        }
    }

    public Sistema getSistema() {
        return sistema;
    }

    public void setSistema(Sistema sistema) {
        this.sistema = sistema;
    }

    (...)

}

转换器

@FacesConverter(forClass = Sistema.class)
public class SistemaConverter implements Converter {

    private final SistemaService sistemaService = lookup(SistemaService.class);

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, 
                              String value) {
        if (value == null || !value.matches("\\d+")) {
            return null;
        }

        Optional<Sistema> optSistema = sistemaService.find(Short.valueOf(value));
        if (!optSistema.isPresent())
            throw new ConverterException(
                    new FacesMessage("Id de sistema inválido " + value));
        return optSistema.get();
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, 
                              Object value) {
        if (!(value instanceof Sistema) || ((Sistema) value).getId() != null) {
            return null;
        }

        return ((Sistema) value).getId().toString();
    }

}

【问题讨论】:

  • 为什么不尝试使用outcome 属性而不是操作? outcome=modulos.

标签: jsf-2 primefaces viewparams


【解决方案1】:

您在 p:menuitem 的结果字符串中使用的 includeViewParams 指令告诉 JSF 将一组特殊的视图参数作为请求参数插入到目标视图的 GET 请求中。

但是,f:param 没有定义视图参数,也不会附加到完成 GET 请求的 URL。

如果您将参数直接附加到隐式导航结果中,它确实有效:“modulod?faces-redirect=true&id=...”

【讨论】:

    猜你喜欢
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 2018-12-10
    • 2014-10-30
    • 1970-01-01
    相关资源
    最近更新 更多