我正在使用JSF设置一个表单(我对此很新),我Validation Error: Value is not valid在其中一个字段上收到消息.这个字段实际上是一个单独的对象(我将在下面显示),它有一个自定义转换器.
这是我所拥有的(删除了不相关的代码):
我有一Citation节课:
@ManagedBean(name="citation")
public class Citation {
private int id;
private Status status;
// getters and setters
}
Run Code Online (Sandbox Code Playgroud)
我也有一个Status你在Citation课堂上引用的课程:
@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();
}
}
Run Code Online (Sandbox Code Playgroud)
然后,对于我的表格,我有:
<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" />
Run Code Online (Sandbox Code Playgroud)
最后,对于我的转换器,我有:
@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());
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我到达我的表单并提交时,我获得Validation Error了状态的下一个.我对此非常陌生,感谢@BalusC,我就这么远了.
任何帮助是极大的赞赏.
验证错误:值无效
如果是<h:selectOneMenu>,只要所选项目与列表中的任何可用项目不匹配,您就会在出现错误时获得此信息.即selectedItem.equals(selectItem)从未返回true任何项目.
因为它显然是一个自定义对象(Status类),你是否正确实现了它Object#equals()(和#hashCode())?如有必要,您可以让IDE(Eclipse/Netbeans)自动生成它们.
更新:在仔细查看您的代码之后,事实证明您实际上是在提交#{s.id}而不是#{s}(整个Status对象).相应地修复itemValue它应该工作(如果equals()仍然正常工作).
| 归档时间: |
|
| 查看次数: |
3054 次 |
| 最近记录: |