dataTable中的selectOneMenu,默认值未正确设置

时间:2011-03-29 13:23:54

标签: jsf datatable jsf-2 selectonemenu

当我在dataTable中放置selectOneMenu时,它不会在selectOneMenu中显示正确的默认值。数据表绑定到POJO列表。 POJO实体Badge引用我们称之为Facility的POJO实体。此工具应该是行中selectOneMenu的选定值(行是每个徽章)。

以下是我简单的表格示例:

<h:dataTable id="examp" value="#{managedBean.badges}" var="badge">
            <h:column rowHeader="rowie">
                <h:selectOneMenu value="#{badge.facility}" id="col1">
                    <f:converter converterId="facilityConverter" />
                    <f:selectItems value="#{managedBean.facilities}"   
                         />
                </h:selectOneMenu> 
            </h:column>         
        </h:dataTable>

selectItems是在PostConstruct中创建的SelectItem对象的List。这些都在我在ViewScope中的托管bean中。

public class ListBadges extends BaseBean {

private List<Badge> badges = new ArrayList<Badge>();
private List<SelectItem> facilities = new ArrayList<SelectItem>();

public ListBadges() {
        getBadgesFromDatabase(true);
}

@PostConstruct
public void init() {
    if (facilities.size() <= 0) {
        try {
            List<Facility> facilityBeans = FacilityHelper.getFacilities();
            for (Facility fac : facilityBeans) {
                facilities.add(new SelectItem(fac, fac.getFacilityName()));
            }
        } catch (tException e) {
            log.error("ListBadges.init(): " + e.getMessage());
            e.printStackTrace();
        }
    }
}

public void getBadgesFromDatabase(boolean forceRefresh) {
    if (forceRefresh || badges == null || badges.isEmpty())
        badges = BadgeHelper.getBadgeList();
}           
///
/// Bean Properties
///

public List<Badge> getBadges() {
    return badges;
}

public void setBadges(List<Badge> badges) {
    this.badges = badges;
}

public List<SelectItem> getFacilities() {
    return facilities;
}

public void setFacilities(List<SelectItem> facilities) {
    this.facilities = facilities;
}

单步执行代码我确认所有数据都是正确的。在我的转换器中,我验证了传递给getAsString的参数是正确的,因此它应该已经识别出正确的项目。

@FacesConverter("facilityConverter")
public class FacilityConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String from) {
        try {
            ELContext elContext = FacesContext.getCurrentInstance().getELContext();
            ListBadges neededBean = 
                (ListBadges) context.getApplication().getELResolver().getValue(elContext, null, "managedBean");
            long id = Long.parseLong(from);
            for (SelectItem sItem : neededBean.getFacilities()) {
                Facility facility = (Facility)sItem.getValue();
                if (facility.getFacilityId() == id)
                    return facility;
            }
        } catch (Exception e) {

        }
        return null;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        try {
            Facility facility = (Facility)value;
            return facility.getFacilityId() + "";
        } catch (Exception e) {

        }
        return null;
    }

}

这是Facility类,它具有equals和hashCode实现:

public class Facility implements java.io.Serializable {

    private static final long serialVersionUID = 1L;

    private long facilityId;
    private String facilityName;
    private String address1;
    private String address2;
    private String city;
    private String state;
    private String postalCode;
    private String url;
    private String phone;
    private String siteManager;

    public Facility() {
    }

    public Facility(String facilityName) {
        this.facilityName = facilityName;
    }

    public Facility(String facilityName,
            String address1, String address2, String city, String state,
            String postalCode, String url, String phone, String siteManager) {
        this.facilityName = facilityName;
        this.address1 = address1;
        this.address2 = address2;
        this.city = city;
        this.state = state;
        this.postalCode = postalCode;
        this.url = url;
        this.phone = phone;
        this.siteManager = siteManager;
    }

    public long getFacilityId() {
        return this.facilityId;
    }

    public void setFacilityId(long facilityId) {
        this.facilityId = facilityId;
    }

    public String getFacilityName() {
        return this.facilityName;
    }

    public void setFacilityName(String facilityName) {
        this.facilityName = facilityName;
    }

    public String getAddress1() {
        return this.address1;
    }

    public void setAddress1(String address1) {
        this.address1 = address1;
    }

    public String getAddress2() {
        return this.address2;
    }

    public void setAddress2(String address2) {
        this.address2 = address2;
    }

    public String getCity() {
        return this.city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getState() {
        return this.state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getPostalCode() {
        return this.postalCode;
    }

    public void setPostalCode(String postalCode) {
        this.postalCode = postalCode;
    }

    public String getUrl() {
        return this.url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getSiteManager() {
        return siteManager;
    }

    public void setSiteManager(String siteManager) {
        this.siteManager = siteManager;
    }

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Facility) || (o == null))
            return false;

        if (o == this)
            return true;

        Facility obj = (Facility)o;
        return obj.getFacilityId() == this.getFacilityId();
    }

    @Override
    public int hashCode() {
        return (new Long(this.getFacilityId()).hashCode()) ^
            ((this.getAddress1() == null) ? 0 : this.getAddress1().hashCode()) ^
            ((this.getAddress2() == null) ? 0 : this.getAddress2().hashCode()) ^
            ((this.getCity() == null) ? 0 : this.getCity().hashCode()) ^
            ((this.getFacilityName() == null) ? 0 : this.getFacilityName().hashCode()) ^
            ((this.getPhone() == null) ? 0 : this.getPhone().hashCode()) ^
            ((this.getPostalCode() == null) ? 0 : this.getPostalCode().hashCode()) ^
            ((this.getSiteManager() == null) ? 0 : this.getSiteManager().hashCode()) ^
            ((this.getUrl() == null) ? 0 : this.getUrl().hashCode());
    }

}

我非常感谢任何反馈。

1 个答案:

答案 0 :(得分:0)

我发现了问题,它与JSF无关。

Eclipse正在加载一个旧版本的Facility bean类,它的equals方法存在编程错误。即使在完全清理,重新发布,清理工作目录,重新启动Web服务器以及重新启动Eclipse之后,这个旧类仍然会被加载。我重新启动了我的计算机,最后正在加载正确的类,这个问题就消失了。

感谢您查看此BalusC。如果没有你写的博客文章,我会完全迷失! http://balusc.blogspot.com/2007/09/objects-in-hselectonemenu.html