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&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();
}
}