编辑模式下的SelectOneMenu默认值

时间:2015-01-09 10:34:40

标签: jsf jsf-2 primefaces

我有一个可编辑的数据表,包含“数据类型”列。编辑此列时,selectOneMenu用于选择值“String”,“Number”或“Date”。当我进入编辑模式时,“数据类型”列被设置为“字符串”(数据类型列表的第一项),但我希望它是此列的当前值(如在Primefaces展示中:{{3例如,如果我点击第二个表的第一行和第三列,应该选择“菲亚特”而不是selectOneMenu中的第一个项目 - “宝马” - 就像我的情况一样)。

我的代码有什么问题?

XHTML:

<p:column headerText="Type" >
        <p:cellEditor>
                <f:facet name="output">
                        <h:outputText value="#{item.dataType.code}" />
                </f:facet>
                <f:facet name="input">
                        <p:selectOneMenu value="#{item.dataType}" converter="myConverter" >
                              <f:selectItems value="#{backingBean.dataTypeList}" var="dt" itemLabel="#{dt.code}" itemValue="#{dt}" />
                        </p:selectOneMenu>
                </f:facet>
        </p:cellEditor>
</p:column>

DataType类:

public class DataType implements Serializable {

    private BigDecimal id;
    private String code;
    private String descr;

    // Getters+Setters.
}

使用Primefaces 5.1。

我可以获得所需的任何其他信息。

1 个答案:

答案 0 :(得分:4)

如果Converter标识的myConverter实施工作properly正在执行其工作,那么如果相关实体DataType没有做到这一点,就会发生这种情况。正确实施equals()(和hashCode())。

只需在您的实体中添加/自动生成它们即可。它应该至少看起来像这样:

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

@Override
public boolean equals(Object other) {
    return (other != null && getClass() == other.getClass() && id != null)
        ? id.equals(((DataType) other).id)
        : (other == this);
}

这也应该在提交表单时立即解决"Validation Error: Value is not valid"错误。

您的所有实体都应该实施它们。为避免重复boileplate,请考虑创建所有实体扩展的基本实体。另请参阅Implement converters for entities with Java Generics