代码之家  ›  专栏  ›  技术社区  ›  Jared

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

  •  2
  • Jared  · 技术社区  · 14 年前

    我正在使用JSF设置一个表单(我是这个领域的新手),我得到了一个 Validation Error: Value is not valid 其中一个字段上的消息。这个字段实际上是一个单独的对象(如下所示),它有一个自定义转换器。

    以下是我的资料(删除了非相关代码):

    我有一个 Citation 班级:

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

    我也有一个 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,我已经走了这么远了。

    非常感谢您的帮助。

    1 回复  |  直到 14 年前
        1
  •  8
  •   Community CDub    8 年前

    <h:selectOneMenu> selectedItem.equals(selectItem) true

    Status Object#equals() #hashCode()


    更新 :仔细查看代码后,发现您实际上正在提交 #{s.id} 而不是 #{s} (整体) 状态 对象)。修复 itemValue 因此,它应该起作用(如果 equals() 仍在正常工作)。