我正在使用JSF设置表单(这是我的新手),并且Validation Error: Value is not valid在其中一个字段上收到消息。该字段实际上是一个具有自定义转换器的单独对象(如下文所示)。
Validation Error: Value is not valid
这是我所拥有的(删除了不相关的代码):
我有一Citation堂课:
Citation
@ManagedBean(name="citation") public class Citation { private int id; private Status status; // getters and setters }
我也有一个Status您在Citation该类中引用的类:
Status
@ManagedBean(name="status") public class Status { private int id; private String name; // getters and setters public List<Status> getAllStatuses() { Session session = HibernateUtil.getCurrentSession(); session.beginTransaction(); session.clear(); Query query = session.createQuery("from Status"); List<Status> 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(); } }
那么对于我的表格,我有:
<h:selectOneMenu id="citation_status" value="#{citation.status}"> <f:selectItems value="#{status.allStatuses} var="s" itemValue="#{s.id}" itemLabel="#{s.name}" /> </h:selectOneMenu> <h:message for="citation_status" />
最后,对于我的转换器,我有:
@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 Error
任何帮助是极大的赞赏。
验证错误:值无效
如果是<h:selectOneMenu>,则只要选定的项目与列表中可用的任何项目都不匹配,就会在出现错误时得到此提示。即selectedItem.equals(selectItem)从未归还true任何物品。
<h:selectOneMenu>
selectedItem.equals(selectItem)
true
由于它显然是自定义对象(Status类),您是否正确实现了它Object#equals()(和#hashCode())?您可以根据需要让IDE(Eclipse / Netbeans)自动生成它们。
Object#equals()
#hashCode()
更新 :仔细查看代码后,结果发现您实际上是在提交#{s.id}而不是#{s}(整个Status对象)提交。相应地修复itemValue它,它应该可以工作(如果equals()仍在正常工作)。
#{s.id}
#{s}
itemValue
equals()