selectonemenu验证错误:值无效

时间:2013-04-17 01:44:15

标签: java hibernate jsf

我正在使用这样的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>

为myBean:

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;
}

正在按照预期填充selectonemenu组件。提交时,会显示Validation Error: Value is not valid。我知道我的实体需要一个合适的equals()方法,所以我只使用id字段用eclipse生成它。然后我不得不将测试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 个答案:

答案 0 :(得分:5)

解决了它。它当然写得很糟糕equals()方法。 首先,我的问题出了问题。 obj未解析为null,但other.przedmiotId已解决。对不起。看看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。使用getter other.getPrzedmiotId()获取值时,它不会再解析为null。

答案 1 :(得分:1)

在您的转换器中:Integer.parseInt(value),并在<f:selectItems中设置itemValue="#{p}",因此每个#{p}都是Przedmiot类型的实例。

另见: Why selectOneMenu Send ItemLabel to the converter?