selectOneMenu в dataTable, значение по умолчанию не устанавливается должным образом - PullRequest
2 голосов
/ 29 марта 2011

Когда я помещаю selectOneMenu в dataTable, он не отображает правильное значение по умолчанию в selectOneMenu.Dataatable связан со списком POJO.Значок сущности POJO ссылается на сущность POJO, которую мы назовем Facility.Это средство должно быть выбранным значением 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>

Элементы выбора являютсяСписок объектов SelectItem, созданных в PostConstruct.Они находятся в моем управляемом бобе, который находится во ViewScope.

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 голосов
/ 29 марта 2011

Я нашел проблему, и это не имеет ничего общего с JSF.

Eclipse загружал более старую версию класса EJB Facility, в которой была программная ошибка в методе equals. Даже после полной очистки, повторной публикации, очистки рабочего каталога, перезапуска веб-сервера и перезапуска Eclipse этот старый класс все еще загружался. Я перезапустил свой компьютер, и, наконец, загружался правильный класс, и эта проблема исчезла.

Спасибо за просмотр этого BalusC. Без этой статьи в блоге, которую вы написали, я был бы полностью потерян! http://balusc.blogspot.com/2007/09/objects-in-hselectonemenu.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...