美好的一天。我有一个CDI Bean,其中包含从另一个xhtml调用的Conversation范围,用于加载数据表的xhtml。这个数据表有分页(不使用延迟加载,只是简单的分页),表加载数据没有问题。但是当我点击某个页面或箭头来更改页面时,它会显示“找不到记录”。这些是文件。
我的CDI Bean,PaisManagedBean:
package com.saplic.fut.beans;
import java.io.Serializable;
import java.util.List;
import javax.enterprise.context.ConversationScoped;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import com.saplic.fut.daos.CiudadDAO;
import com.saplic.fut.entity.Ciudad;
@Named("paisMB")
@ConversationScoped
public class PaisManagedBean implements Serializable {
private static final long serialVersionUID = -203436251219946811L;
@Inject
private CiudadDAO ciudadDAO;
private List<Ciudad> ciudades;
private Integer idCity;
public String loadCities() {
ciudades = ciudadDAO.cargarCiudades();
return "listaCiudades";
}
public void loadCityInfo(ActionEvent e) {
System.out.println("The ID is " + getIdCity());
return;
}
public List<Ciudad> getCiudades() {
return ciudades;
}
public void setCiudades(List<Ciudad> ciudades) {
this.ciudades = ciudades;
}
public Integer getIdCity() {
return idCity;
}
public void setIdCity(Integer idCity) {
this.idCity = idCity;
}
}
然后,这个xhtml是我的索引。从这里我只需要调用paisMB.loadCities()并登陆我的数据表:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<ui:composition template="/plantilla/template.xhtml">
<ui:define name="contenido">
<h:form>
<p:commandButton action="#{paisMB.loadCities()}"
value="Show cities" />
</h:form>
</ui:define>
</ui:composition>
</html>
最后是我有数据表的xhtml,listaCiudades.xhtml:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<ui:composition template="/plantilla/template.xhtml">
<ui:define name="contenido">
<h:form id="frm1">
<p:dataTable id="tablita" resizableColumns="true" rowIndexVar="rowIdx"
paginator="true" rows="10" paginatorPosition="bottom" value="#{paisMB.ciudades}"
var="ciu" >
<p:column headerText="Código pais">
<p:outputLabel value="#{ciu.codigoPais}" />
</p:column>
<p:column headerText="Distrito">
<p:outputLabel value="#{ciu.distrito}" />
</p:column>
<p:column headerText="Nombre">
<p:outputLabel value="#{ciu.nombre}" />
</p:column>
<p:column headerText="Población">
<p:outputLabel value="#{ciu.poblacion}" />
</p:column>
<p:column headerText="Accion">
<p:commandLink actionListener="#{paisMB.loadCityInfo()}" ajax="false" process="frm1" value="Detail">
<f:setPropertyActionListener value="#{ciu.id}" target="#{paisMB.idCity}" />
</p:commandLink>
</p:column>
</p:dataTable>
</h:form>
</ui:define>
</ui:composition>
</html>
我尝试改为@SessionScoped而不是@ConversationScoped并且它有效,看起来它忽略了@ConversationScoped,因为当我调试并监视getCiudades()getter时,当我点击页面时,ciudades为null。它失去了价值。
此外,我的数据表中的commandLink不起作用。它不会调用我的方法paisMB.loadCityInfo()。我尝试使用action而不是actionListener,并从方法中删除参数但它不起作用。
发生了什么事?