使用自定义转换器时JSFvalidation错误

我正在使用JSF设置一个表单(我对此很新)并且我收到了Validation Error: Value is not valid其中一个字段的Validation Error: Value is not valid 。 这个字段实际上是一个单独的对象(我将在下面显示),它有一个自定义转换器。

这是我所拥有的(删除了不相关的代码):

我有一个Citation课程:

 @ManagedBean(name="citation") public class Citation { private int id; private Status status; // getters and setters } 

我还有一个你在Citation类中引用的Status类:

 @ManagedBean(name="status") public class Status { private int id; private String name; // getters and setters public List getAllStatuses() { Session session = HibernateUtil.getCurrentSession(); session.beginTransaction(); session.clear(); Query query = session.createQuery("from Status"); List statuses = query.list(); try { session.getTransaction().commit(); } catch (HibernateException e) { // TODO: handle exception session.getTransaction().rollback(); } return statuses; } @Override public boolean equals(Object obj) { if (obj == null) return false; if (!(obj instanceof Status)) return false; if (this.id == ((Status)obj).getId()) { return true; } else { return false; } } @Override public int hashCode() { return this.name.hashCode(); } } 

然后,对于我的表格,我有:

     

最后,对于我的转换器,我有:

 @FacesConverter(forClass=Status.class) public class StatusConverter implements Converter { @Override public Object getAsObject(FacesContext context, UIComponent component, String value) { // uses Hibernate to get the Status object (using a breakpoint in Eclipse, I have verified that this works) // I can post this code if needed, but just trying to keep it short :) } @Override public String getAsString(FacesContext context, UIComponent component, Object value) { return String.valueOf(((Status) value).getId()); } } 

现在,当我到达我的表单并提交时,我收到状态旁边的Validation Error 。 我对此非常陌生,感谢@BalusC,我就这么远了。

任何帮助是极大的赞赏。

validation错误:值无效

如果是 ,只要所选项目与列表中的任何可用项目不匹配,您就会在出现错误时获得此信息。 即selectedItem.equals(selectItem)从未为任何项返回true

因为它显然是一个自定义对象( Status类),你是否正确实现了它的Object#equals() (和#hashCode() )? 如有必要,您可以让IDE(Eclipse / Netbeans)自动生成它们。

也可以看看:

  • 在Java中覆盖equals和hashCode
  • 如何在bean /实体中实现equals()

更新 :仔细查看代码后,事实certificate您实际上是在提交#{s.id}而不是#{s} (整个Status对象)。 相应地修复itemValue ,它应该工作(如果equals()仍在正常工作)。