Jsf 带有POJO和转换器问题的Facelet SelectOne菜单

Jsf 带有POJO和转换器问题的Facelet SelectOne菜单,jsf,facelets,converter,selectonemenu,Jsf,Facelets,Converter,Selectonemenu,我想有一个公式和下拉菜单的facelet页面。使用下拉菜单,用户应选择Lieferant类型的POJO: public class Lieferant extends AbstractPersistentWarenwirtschaftsObject { private String firma; public Lieferant(WarenwirtschaftDatabaseLayer database, String firma) { this(databa

我想有一个公式和下拉菜单的facelet页面。使用下拉菜单,用户应选择Lieferant类型的POJO:

public class Lieferant extends AbstractPersistentWarenwirtschaftsObject {

    private String firma;

    public Lieferant(WarenwirtschaftDatabaseLayer database, String firma) {
        this(database, null, firma);
    }

    public Lieferant(WarenwirtschaftDatabaseLayer database, Long primaryKey, String firma) {
        super(database, primaryKey);
        this.firma = firma;
    }

    public String getFirma() {
        return firma;
    }

    @Override
    public String toString() {
        return getFirma();
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((firma == null) ? 0 : firma.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Lieferant other = (Lieferant) obj;
        if (firma == null) {
            if (other.firma != null)
                return false;
        } else if (!firma.equals(other.firma))
            return false;
        return true;
    }

}
以下是我编写的facelet代码:

<h:selectOneMenu> 
页面加载时没有任何错误。当我填写并提交公式时,页面上会显示一条错误消息:

Bestellung:lieferantenBestellungForm:lieferant: Validierungsfehler: Wert ist keine gültige Auswahl
translated: validation error: value is not a valid selection
不幸的是,它没有说它在谈论什么价值。转换器似乎工作正常

我找到了这个和这个 ,但我无法在代码中找到问题。为什么

List<SelectItem> 
在第二个链接的示例中使用。给我同样的错误

任何帮助都将不胜感激。提前谢谢

验证错误:值不是有效的选择

此错误表示所选项目与列表中的任何所选项目都不匹配。在您的情况下,这可能有两个原因:要么Objectequals实现错误,要么后面的getter在提交表单期间在后续请求中返回的列表与在提交表单之前的初始请求期间以及在选择值期间返回的列表不同

排除一个或另一个:您可以使用普通的testcase轻松测试Objectequals,并且可以通过将bean放入会话范围来测试列表的一致性


要清楚的是,您的转换器看起来很好,似乎工作正常,否则您将无法获得此类错误消息;因此,转换步骤成功完成。

我确信舒尔的转换器工作正常,但最终的错误在转换器中。也许这是在调试过程中发生的。下面是转换器的固定getAsString方法。N

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    if (value != null && value instanceof Lieferant) {
        Lieferant lieferant = (Lieferant) value;
        return "" + lieferant.getPrimaryKey();
    }
    return "";
}
现在它返回primaryKey,它用作selectOneMenu列表的值。此外,我还从selectItems标记更改了此属性:

 itemValue="#{lieferant}"

如果最后一次更改是必要的,我现在不是舒尔。但是现在中尉们已经正确转换了。

谢谢你的回答。这段时间我自己修好了。以后几天就可以了。
List<SelectItem> 
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    if (value != null && value instanceof Lieferant) {
        Lieferant lieferant = (Lieferant) value;
        return "" + lieferant.getPrimaryKey();
    }
    return "";
}
 itemValue="#{lieferant}"