使用自定义转换器时JSF验证错误

Jar*_*red 2 java jsf

我正在使用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,我就这么远了.

任何帮助是极大的赞赏.

Bal*_*usC 8

验证错误:值无效

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

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

也可以看看:


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