我正在使用这样的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>
答案 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
类型的实例。