Jsf 2 获取未传递给ViewScope ManagedBean的参数

Jsf 2 获取未传递给ViewScope ManagedBean的参数,jsf-2,primefaces,viewparams,Jsf 2,Primefaces,Viewparams,我有一个带有p:contextMenu的p:dataTable和一些p:menuitems。其中一个菜单项应该将一个id传递给另一个视图,该视图的读取方式与前面指出的相同 问题是转换器会抛出所需的消息,就像没有发送id一样——而且看起来确实没有。我想我遗漏了一些基本的东西,但我真的想不出来。代码如下: 源代码视图 转换器 @facescoverter(forClass=Sistema.class) 公共类SistemaConverter实现转换器{ 私有最终SistemaService Sist

我有一个带有
p:contextMenu
p:dataTable
和一些
p:menuitem
s。其中一个菜单项应该将一个id传递给另一个视图,该视图的读取方式与前面指出的相同

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

源代码视图 转换器
@facescoverter(forClass=Sistema.class)
公共类SistemaConverter实现转换器{
私有最终SistemaService SistemaService=查找(SistemaService.class);
@凌驾
公共对象getAsObject(FacesContext上下文、UIComponent组件、,
字符串值){
if(value==null | |!value.matches(\\d+)){
返回null;
}
可选的optSistema=sistemaService.find(Short.valueOf(value));
如果(!optistema.isPresent())
抛出新ConverterException(
新面孔信息(“Id de sistema inválido”+价值);
返回optistema.get();
}
@凌驾
公共字符串getAsString(FacesContext上下文、UIComponent、,
对象值){
if(!(Sistema的值实例)| |((Sistema)值).getId()!=null){
返回null;
}
返回((Sistema)值).getId().toString();
}
}

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

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


如果将参数直接附加到隐式导航结果:“moduled?faces redirect=true&id=…”

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

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


如果将参数直接附加到隐式导航结果:“moduled?faces redirect=true&id=…”

为什么不尝试使用
output
属性而不是操作<代码>结果=模。为什么不尝试使用
结果
属性而不是操作<代码>结果=模。
<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>
@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();
    }

}