1

我有一个p:dataTablewithp:contextMenu和一些p:menuitems。这些菜单项中的一个应将 id 传递给另一个视图,就像在此处指出的那样读取。

问题是转换器会抛出所需的消息,就像没有发送 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();
    }

}
4

1 回答 1

1

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

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

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

于 2013-06-18T22:19:11.607 回答