Jsf 使用primefaces筛选器后获取空行键

Jsf 使用primefaces筛选器后获取空行键,jsf,primefaces,jsf-2,datatable,Jsf,Primefaces,Jsf 2,Datatable,当我在primefaces数据表中不使用筛选器并尝试选择行时,例如,按edit it working well并获取所选行。但当我使用primefaces筛选器并选择筛选行时,请单击edit 启用选择时,我得到了org.primefaces.model.SelectableDataModel异常 我知道这意味着我有一个空的行键,但我不知道为什么。我使用的是一个有效的行键(id)数据表的主键,当我使用调试时,我发现它在失败的情况下获得了两次id,第一次得到了正确的过滤id,第二次得到了空id。 我

当我在primefaces数据表中不使用筛选器并尝试选择行时,例如,按edit it working well并获取所选行。但当我使用primefaces筛选器并选择筛选行时,请单击edit 启用选择时,我得到了org.primefaces.model.SelectableDataModel异常

我知道这意味着我有一个空的行键,但我不知道为什么。我使用的是一个有效的行键(id)数据表的主键,当我使用调试时,我发现它在失败的情况下获得了两次id,第一次得到了正确的过滤id,第二次得到了空id。 我的问题是,为什么它两次获取rowkey id,而第二次获取null并导致异常

    <h:body>
    <h:form prependId="false" id="growlForm">
        <p:growl id="growl" showDetail="false" />
    </h:form>
    <h:form id="dataForm">
    <p:panel id="ingerdientsTable">
    <f:facet name="header">
          <h:outputText value="Standard Food List" />
        </f:facet>  
         <p:dataTable id="ingedientsTable" widgetVar="ingedientsTable" var="ingerdients" resizableColumns="true"
                    selectionMode="single" selection="#{mealBean.selectedStandardIngerdients}"
                     rowKey="#{ingerdients.getId()}" value="#{mealBean.allIngerdients}" rowsPerPageTemplate="5,10,25,50" rows="20"
                     paginator="true" style="padding-top:10px;padding-bottom:10px" tableStyle="table-layout: auto"
                     paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown} ">

                    <p:column headerText="Food Type"  filterBy="#{ingerdients.name}"><h:outputText value="#{ingerdients.name}" /></p:column>
                    <p:column headerText="Protein(gm)"  filterBy="#{ingerdients.containedProtiens}"><h:outputText value="#{ingerdients.containedProtiens}" /></p:column>
                    <p:column headerText="Carbs(gm)"  filterBy="#{ingerdients.containedCarbs}"><h:outputText value="#{ingerdients.containedCarbs}" /></p:column>
                    <p:column headerText="Fats(gm)"  filterBy="#{ingerdients.containedFats}"><h:outputText value="#{ingerdients.containedFats}" /></p:column>
                    <p:column headerText="Total Calories" filterBy="#{ingerdients.totalCalories}"><h:outputText value="#{ingerdients.totalCalories}" /></p:column>
                    <p:column styleClass="action-column">
                        <f:facet name="header">
                            <h:outputText value="Actions" />
                        </f:facet>
                        <p:commandButton id="addToMeal" value="Add To Meal" icon="ui-icon-create" update="addToMealDialog"
                            action="#{mealBean.showIngerdientsToMealDialog(ingerdients)}" immediate="true"
                            title="Add To meal" ajax="true">
                        </p:commandButton>
                        <p:tooltip for="addToMeal" value="Add To Meal"
                            showEffect="fade" hideEffect="fade" />
                            </p:column>

                    </p:dataTable>
        </p:panel>




public class StandardIngerdients{
    @Id
    @Column(name="Id")
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;
    @ManyToOne
    @JoinColumn(name="FolderPathId",referencedColumnName="Id",nullable=true)
    private FolderPath folderPath;

    @Column(name="Name")
    private String name;
    @Column(name="ContainedProteins")
    @NotNull
    private Double containedProtiens;
    @Column(name="ContainedCarbs")
    @NotNull
    private Double containedCarbs;
    @Column(name="ContainedFats")
    @NotNull
    private Double containedFats;
    @Column(name="TotalCalories")
    @NotNull
    private Double totalCalories;
    @Column(name="ImageName")
    private String imageName;
    public Integer getId() {
        return id;
    }
    public void setId(Integer Id) {
        this.id = Id;
    }
    public FolderPath getFolderPath() {
        return folderPath;
    }
    public void setFolderPath(FolderPath folderPath) {
        this.folderPath = folderPath;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public Double getContainedProtiens() {
        return containedProtiens;
    }
    public void setContainedProtiens(Double containedProtiens) {
        this.containedProtiens = containedProtiens;
    }
    public Double getContainedCarbs() {
        return containedCarbs;
    }
    public void setContainedCarbs(Double containedCarbs) {
        this.containedCarbs = containedCarbs;
    }
    public Double getContainedFats() {
        return containedFats;
    }
    public void setContainedFats(Double containedFats) {
        this.containedFats = containedFats;
    }
    public Double getTotalCalories() {
        return totalCalories;
    }
    public void setTotalCalories(Double totalCalories) {
        this.totalCalories = totalCalories;
    }
    public String getImageName() {
        return imageName;
    }
    public void setImageName(String imageName) {
        this.imageName = imageName;
    }


}

公共类标准化客户端{
@身份证
@列(name=“Id”)
@GeneratedValue(策略=GenerationType.AUTO)
私有整数id;
@许多酮
@JoinColumn(name=“FolderPathId”,referencedColumnName=“Id”,nullable=true)
私有FolderPath FolderPath;
@列(name=“name”)
私有字符串名称;
@列(name=“ContainedProteins”)
@NotNull
私人双容器蛋白质;
@列(name=“ContainedCarbs”)
@NotNull
私人双容器碳水化合物;
@列(name=“ContainedFats”)
@NotNull
私人双含脂肪;
@列(name=“totalcarries”)
@NotNull
私人双倍总热量;
@列(name=“ImageName”)
私有字符串imageName;
公共整数getId(){
返回id;
}
公共无效集合Id(整数Id){
this.id=id;
}
公共FolderPath getFolderPath(){
返回folderPath;
}
公共void setFolderPath(FolderPath FolderPath){
this.folderPath=folderPath;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共双GetContainedProteins(){
返回含有蛋白质;
}
public void setcontainedproteins(双containedproteins){
this.containedproteins=containedproteins;
}
公共双getContainedCarbs(){
返回含有碳水化合物;
}
公共无效设置containedCarbs(双containedCarbs){
this.containedCarbs=containedCarbs;
}
公共双getContainedFats(){
返回含有脂肪;
}
公共无效设置包含FAT(双包含FAT){
this.containedFats=containedFats;
}
公共双getTotalCalories(){
返回总热量;
}
公共空间设置总热量(双倍总热量){
this.totalcarries=总卡路里;
}
公共字符串getImageName(){
返回图像名称;
}
public void setImageName(字符串imageName){
this.imageName=imageName;
}
}

您可以尝试下面的代码,我认为可以解决它

rowKey="#{ingerdients.id}"

我也有同样的问题。问题是我让我的类实现了可序列化,这保证了数据的“完整性”(可以这么说),以免消失。。。所以你们的课是这样的:

 public class StandardIngerdients implements Serializable {

错误ypu get在任何地方都不可见。有stacktrace吗?我上传了一个错误页面的图像,我得到的错误等应该是文本,而不是图像。搜索引擎无法在图像中搜索文本。您是否调试了产生错误的代码?你试过答案了吗?是的,我对代码进行了调试,发现它在使用filter one获得正确的筛选值时,输入了行键的getId方法2次,第二次为null,这就是我得到异常的原因。我也尝试了答案,但我有相同的错误,我尝试在空白页中移动datatable,我有相同的错误还有一个错误。我的问题是,为什么在进入编辑方法一次得到正确的筛选值,第二次得到空值之后,它会进入rowkey的getId方法两次?如果您只需要具有读取权限,则通常
{ingerdirents.id}
{ingerdirents.getId()}
是相同的。这是一个很好的建议,但既然你陈述了“尝试”和“思考”,那么下次你最好先发表评论