Отображение значений в раскрывающемся списке SelectOneMenus (Parent-Child) - PullRequest
0 голосов
/ 10 октября 2011

Возникает раздражающая проблема, когда я заполняю выборку из детализации двумя selectOneMenu.Первое меню Сектор , которое управляет другим Категория .Я загружаю выбор для Категории в зависимости от Сектора, и все это работает нормально.

Но когда я редактирую бизнес-объект, к которому прикреплен Сектор категории (с одним).Категория не отображается при первой загрузке страницы edit.xhtml .Я знаю, что значение корректно в компоненте SessionScoped.Если я выберу другую Секторную категорию, а затем вернусь к начальному Сектору, категория будет должным образом установлена ​​при том, что она была сохранена в первую очередь.

Классы POJO (Секторная категория) имеют hashCode() иequals(Object object) функции.

У меня есть сгенерированные CRUD JSF-конвертеры для объекта POJO, но я не думаю, что это вызывает проблему.Я думаю, что второй selectOneMenu не отображает свое значение, как должно по какой-то причине.Если я переверну родительский объект (сектор) на что-то другое и вернусь к исходному состоянию, отобразится правильное значение из управляемого bean-компонента.

Как я могу заставить компонент категории selectOneMenu отображать значение вуправляемый бин?

Привет Крис

Сообщение об ошибке Faces

FacesMessage(s) have been enqueued, but may not have been displayed.
sourceId=null[severity=(ERROR 2), summary=(No activity selected), detail=(No activity selected)]

Edit.xhtml

... 
<h:outputLabel value="Sector:" />                    
<h:selectOneMenu id="sectorSelector" value="#{activityController.selectedSector}" title="#{bundle.CreateSectorLabel_sectorName}" required="false" requiredMessage="#{bundle.CreateSectorRequiredMessage_sectorName}"
        valueChangeListener="#{activityController.changeSectorMenu}"
            disabled="#{activityController.activityStatusOngoing or activityController.activityStatusComplete}">
    <f:ajax event="change" execute="@this" render="categoryMenu"/>
            <f:selectItems value="#{sectorController.itemsAvailableSelectOne}"/>
</h:selectOneMenu>

<h:outputLabel value="Category:" />
    <h:selectOneMenu id="categoryMenu" value="#{activityController.selectedCategory}" title="#{bundle.CreateSectorLabel_sectorName}" 
        required="true" requiredMessage="#{bundle.CreateCategoryRequiredMessage_sector}"
            disabled="#{activityController.activityStatusOngoing}" rendered="true"> 
    <f:selectItems value="#{activityController.categorySelection}"/>
    </h:selectOneMenu>
...

Бин контроллера для категории

@ManagedBean(name = "categoryController")
@SessionScoped
public class CategoryController implements Serializable{

    ....

    @FacesConverter(forClass = Category.class)
    public static class CategoryControllerConverter implements Converter {

        @Override
        public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
            if (value == null || value.length() == 0) {
                return null;
            }
            CategoryController controller = (CategoryController) facesContext.getApplication().getELResolver().
                    getValue(facesContext.getELContext(), null, "categoryController");
            return controller.ejbFacade.find(getKey(value));
        }

        java.lang.Integer getKey(String value) {
            java.lang.Integer key;
            key = Integer.valueOf(value);
            return key;
        }

        String getStringKey(java.lang.Integer value) {
            StringBuffer sb = new StringBuffer();
            sb.append(value);
            return sb.toString();
        }

        @Override
        public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
            if (object == null) {
                return null;
            }
            if (object instanceof Category) {
                Category o = (Category) object;
                return getStringKey(o.getIdCategory());
            }
            else {
                throw new IllegalArgumentException("object " + object + " is of type " + object.getClass().getName() + "; expected type: " + CategoryController.class.getName());
            }
        }
    }

Часть объекта POJO

...
public class Category implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "idCategory")
    private Integer idCategory;
    ...

Ответы [ 2 ]

0 голосов
/ 11 октября 2011

Это были не Конвертеры, как я сначала подумал.Это был рендеринг двух selectOneMenu.Это изменения, которые я внес в файл xhml.Спасибо за ваше время и усилия, привет Крис.

Edit.xhml

<h:outputLabel value="Sector:" />                    
<h:selectOneMenu id="sectorSelector" value="#{activityController.selectedSector}" title="#{bundle.CreateSectorLabel_sectorName}" required="false" requiredMessage="#{bundle.CreateSectorRequiredMessage_sectorName}"
        valueChangeListener="#{activityController.changeSectorMenu}" immediate="true"
            disabled="#{activityController.activityStatusOngoing or activityController.activityStatusComplete}">
    <a4j:ajax event="change" execute="@this categoryMenu" render="categoryMenu"/>
            <f:selectItems value="#{sectorController.itemsAvailableSelectOne}"/>
</h:selectOneMenu>

<h:outputLabel value="Category:" />
    <h:selectOneMenu id="categoryMenu" value="#{activityController.selectedCategory}" title="#{bundle.CreateSectorLabel_sectorName}" 
        binding="#{activityController.categoryMenu}"
            required="true" requiredMessage="#{bundle.CreateCategoryRequiredMessage_sector}"                                     
            disabled="#{activityController.activityStatusOngoing}">
            <f:selectItems value="#{activityController.categorySelection}"/>
</h:selectOneMenu>
0 голосов
/ 10 октября 2011

Вариант (не такой сложный, как я недавно сделал переключение) - включить модули Seam Faces и Persistence.Модуль Seam Faces позволяет ViewScope без аннотации @ManagedBean.

Но SeamFaces заставляет нас (что оправдано) использовать аннотации CDI (@Named вместо @ManagedBean и т. Д.).

Пожалуйста, обратитесь этот пост .(Вы можете использовать @EJB, а также внедрить любой компонент, помеченный @Named)

...