selectonemenu验证错误:值无效。

3
我将使用selectonemenu来完成如下操作:
<h:selectOneMenu value="#{MyBean.zajecie.przedmiot}">
    <f:selectItems value="#{MyBean.przedmioty}" var="p"
        itemLabel="#{p.nazwa}" itemValue="#{p}" />
    <f:converter converterId="converter.PrzedmiotConverter" />
</h:selectOneMenu>

我的豆子:

private Zajecie zajecie;//+set get
private List<Przedmiot> przedmioty;//+set get

@PostConstruct
private void init() {
    przedmioty = przedmiotDao.findByLogin("login");
    zajecie = new Zajecie();
}

以及转换方法:

public Object getAsObject(FacesContext context, UIComponent component, String value) {
    PrzedmiotDao przedmiotDao = DaoFactory.getInstance().getPrzedmiotDao();
    Przedmiot przedmiot = przedmiotDao.findById(Przedmiot.class, Integer.parseInt(value));
    return przedmiot;
}

public String getAsString(FacesContext context, UIComponent component, Object value) {
    Przedmiot przedmiot = (Przedmiot) value;
    String idAsString = String.valueOf(przedmiot.getPrzedmiotId());
    return idAsString;
}

选择单个菜单组件正在按照其预期进行填充。当我提交时,它会显示“验证错误:值无效”。我知道我的实体需要一个适当的equals()方法,因此我使用eclipse只使用id字段生成了它。然后我不得不改变测试getClass() != obj.getClass()到obj instanceof Przedmiot,因为obj.getClass()返回类似于Przedmiot_$$_javassist_1这样的内容。我不确定那是否相关,因为毕竟obj被证明是null。我做错了什么?
编辑:
MyBean是ViewScoped。
有趣的是,使用相同转换器的类似代码在应用程序的其他部分中起作用。区别在于,在工作部分中,我只是查看类型为Przedmiot的列表,并以另一种方式获取它。
@PostConstruct
private void init() {
    student = studentDao.findByLogin(ra.getUser());
}

<h:selectOneMenu value="#{otherBean.przedmiot}">
    <f:selectItems value="#{otherBean.student.grupa.przedmiots}" var="p" 
        itemLabel="#{p.nazwa}" itemValue="#{p}" />
    <f:converter converterId="converter.PrzedmiotConverter" />
</h:selectOneMenu>
2个回答

6

问题已解决。当然,代码中的equals()方法写得很糟糕。 首先,我的问题有一个错误。 obj并没有解析为null,但是other.przedmiotId却解析为了null。对此我感到非常抱歉。请看一下eclipse生成的方法:

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (!(obj instanceof Przedmiot))//changed this from (getClass() != obj.getClass())
        return false;
    Przedmiot other = (Przedmiot) obj;
    if (przedmiotId == null) {
        if (other.przedmiotId != null)
            return false;
    } else if (!przedmiotId.equals(other.przedmiotId))
        return false;
    return true;
}

问题出在other.przedmiotId上。使用getterother.getPrzedmiotId()获取值时,它不再解析为空。

1

那不起作用。我无法将字符串转换为Przedmiot。这个值不是应该表示一个唯一的ID,就像你给出的链接中解释的那样吗? - user2270884
哦,非常抱歉,加载页面或提交到服务器时您遇到错误了吗? - Rong Nguyen
提交表单时,验证失败。 - user2270884
当出现错误时,当出现 bug 时,行号是多少?(我的英语不好,抱歉) - Rong Nguyen
当我点击提交按钮时,验证错误消息会显示在h:messages组件中。 - user2270884

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接