SelectOneMenu始终显示第一个项目而非选定的 - Primefaces

时间:2016-10-08 19:09:11

标签: jsf primefaces selectonemenu selectedvalue

在这个问题上会得到一些帮助。

我有几个JSF页面,但其中一个是子类别,其中有一个 SelectOneMenu 用于选择类别,但是当我尝试编辑子类别时,这个 SelectOneMenu 始终显示第一个值,但未获得预选。

我怎么能解决这个问题。我已经阅读了很多 SO帖子和eventhougn我已经实现了一些我没有实现的建议。例如, @BalusC 的一个:

primefaces selectOneMenu doesn't working when it should

以下是视图

<h:outputText value="Subcategory ID : #{subcategoryController.subcategory.subcategoryId}"/>

<p:selectOneMenu id="cboCategoryDialog" converter="subcategoryConverter"
                 value="#{subcategoryController.category.categoryId}"
                 style="width: 100%"

    <f:selectItems value="#{subcategoryController.categoryList}"
                   var="subcat"
                   itemLabel="#{subcat.categoryName}"
                   itemValue="#{subcat.categoryId}"/>
</p:selectOneMenu>**

这是子类别实体:

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "subcategory_id")
private Integer subcategoryId;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 45)
@Column(name = "subcategory_name")
private String subcategoryName;
@JoinColumn(name = "category_id", referencedColumnName = "category_id")
@OneToOne(optional = false;
private Category categoryId;

//Getters and Setters Methods

@Override
public int hashCode() {
    return (subcategoryId != null)
            ? (this.getClass().hashCode() + subcategoryId.hashCode())
            : super.hashCode();
}

@Override
public boolean equals(Object obj) {

    return (obj instanceof Subcategory) && (subcategoryId != null)
            ? subcategoryId.equals(((Subcategory) obj).subcategoryId)
            : (obj == this);
}

SubcategoryConverter

@RequestScoped
@FacesConverter("subcategoryConverter")
public class SubcategoryConverter implements Converter {

@EJB
private SubcategoryFacadeLocal EJBsubcategory;

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    if (!(value instanceof Subcategory) || ((Subcategory) value).getSubcategoryId() == null) {
        return null;
    }

    return String.valueOf(((Subcategory) value).getSubcategoryId());
}

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    if (value == null || !value.matches("\\d+")) {
        return null;
    }

    Subcategory subcategory = EJBsubcategory.find(Integer.valueOf(value));

    if (subcategory == null) {
        throw new ConverterException(new FacesMessage("Unknown operation ID: " + value));
    }

    return subcategory;

    }
}

下图显示了当我尝试编辑任何项目时的对话框,它始终显示计算机,因为它是第一个它。

See the image showing the issue

我一直在阅读一些有关此问题的相关有用的问题,但我无法修复它。

提前致谢,

2 个答案:

答案 0 :(得分:1)

在查看代码后,我意识到我在 JSF中使用了错误的实体。

例如:

在问题中,我发布了:subcategoryController.category.categoryId,用于在子类别对象中保存类别对象。

如下:

<p:selectOneMenu id="cboCategoryDialog" converter="subcategoryConverter"
    value="#{subcategoryController.category.categoryId}"

但是,正确的方法如下:

<p:selectOneMenu id="cboCategoryDialog" converter="omnifaces.SelectItemsConverter"
    value="#{subcategoryController.subcategory.categoryId}"

现在,这个组件是&#34;指向&#34;到正确的对象。

我面临的另一个问题是:

由于我有嵌套实体,例如: Entity.entity.entity ,在使用它们之前,它们应该在每个级别中被初始化。

有些帖子确实非常真实地帮助了我:

解决嵌套实体问题(PropertyNotFoundException)

Identifying and solving javax.el.PropertyNotFoundException: Target Unreachable

在SelectOneMenu上使用普通和OmniFaces转换器:

http://balusc.omnifaces.org/2007/09/objects-in-hselectonemenu.html

答案 1 :(得分:0)

确保实现了实体hashCode()和equals()方法,并且不会尝试访问可空字段。这对我有用!