Jsf 使用primefaces筛选器后获取空行键
当我在primefaces数据表中不使用筛选器并尝试选择行时,例如,按edit it working well并获取所选行。但当我使用primefaces筛选器并选择筛选行时,请单击edit 启用选择时,我得到了org.primefaces.model.SelectableDataModel异常 我知道这意味着我有一个空的行键,但我不知道为什么。我使用的是一个有效的行键(id)数据表的主键,当我使用调试时,我发现它在失败的情况下获得了两次id,第一次得到了正确的过滤id,第二次得到了空id。 我的问题是,为什么它两次获取rowkey id,而第二次获取null并导致异常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。 我
<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()}
是相同的。这是一个很好的建议,但既然你陈述了“尝试”和“思考”,那么下次你最好先发表评论