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

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>
4

2 回答 2

5

解决了。这当然是写得很糟糕的equals()方法。首先,我的问题有一个错误。obj没有解决为空,但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。

于 2013-04-17T18:24:13.123 回答
1

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

另请参阅: 为什么 selectOneMenu 将 ItemLabel 发送给转换器?

于 2013-04-17T03:27:57.853 回答