GET参数未传递给ViewScoped ManagedBean

时间:2013-06-17 19:38:16

标签: jsf-2 primefaces viewparams

我有一个p:dataTable p:contextMenu和一些p:menuitem。其中一个菜单项应该将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();
    }

}

1 个答案:

答案 0 :(得分:1)

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

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

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

相关问题