SelectOneMenu всегда показывает первый элемент, а не выбранный - Primefaces

Некоторая помощь будет оценена по этому вопросу.

У меня есть несколько страниц JSF, но одна из них является подкатегорией, где есть SelectOneMenu для выбора категории, но когда я пытаюсь изменить подкатегорию, это SelectOneMenu всегда показывает первое значение и не становится предварительно выбранным.

Как я мог это решить. Я прочитал много сообщений SO и, в конце концов, я реализовал пару советов, которые я не добился. например, у @BalusC:

primefaces selectOneMenu не работает, когда должен

Вот вид

<h:outputText value="Subcategory ID : #{subcategoryController.subcategory.subcategoryId}"/>

<p:selectOneMenu id="cboCategoryDialog" converter="subcategoryConverter"
                 value="#{subcategoryController.category.categoryId}"
                 style="width: 100%"

    <f:selectItems value="#{subcategoryController.categoryList}"
                   var="subcat"
                   itemLabel="#{subcat.categoryName}"
                   itemValue="#{subcat.categoryId}"/>
</p:selectOneMenu>**

Это объект подкатегории:

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "subcategory_id")
private Integer subcategoryId;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 45)
@Column(name = "subcategory_name")
private String subcategoryName;
@JoinColumn(name = "category_id", referencedColumnName = "category_id")
@OneToOne(optional = false;
private Category categoryId;

//Getters and Setters Methods

@Override
public int hashCode() {
    return (subcategoryId != null)
            ? (this.getClass().hashCode() + subcategoryId.hashCode())
            : super.hashCode();
}

@Override
public boolean equals(Object obj) {

    return (obj instanceof Subcategory) && (subcategoryId != null)
            ? subcategoryId.equals(((Subcategory) obj).subcategoryId)
            : (obj == this);
}

Конвертер подкатегорий

@RequestScoped
@FacesConverter("subcategoryConverter")
public class SubcategoryConverter implements Converter {

@EJB
private SubcategoryFacadeLocal EJBsubcategory;

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
    if (!(value instanceof Subcategory) || ((Subcategory) value).getSubcategoryId() == null) {
        return null;
    }

    return String.valueOf(((Subcategory) value).getSubcategoryId());
}

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
    if (value == null || !value.matches("\\d+")) {
        return null;
    }

    Subcategory subcategory = EJBsubcategory.find(Integer.valueOf(value));

    if (subcategory == null) {
        throw new ConverterException(new FacesMessage("Unknown operation ID: " + value));
    }

    return subcategory;

    }
}

На изображении ниже показано диалоговое окно, когда я пытаюсь отредактировать какой-либо элемент, он всегда показывает компьютер, потому что он первый.

Посмотрите изображение, показывающее проблему

Я читал некоторые полезные вопросы об этом, но я не смог это исправить.

Заранее спасибо,


person JVz    schedule 08.10.2016    source источник
comment
где твой преобразователь? что такое subcategoryController.category.categoryId?   -  person Kenshin    schedule 09.10.2016
comment
Я использую Onmifaces SelectItemsConverter. subcategoryController.category.categoryId — это место, где выбранная категория сохраняется в объекте подкатегории. @Арун   -  person JVz    schedule 09.10.2016
comment
Пожалуйста, отправьте код конвертера   -  person Kenshin    schedule 09.10.2016
comment
Извините за задержку ответа. Добавил преобразователь. @Арун   -  person JVz    schedule 10.10.2016
comment
Я думаю, что вся проблема в subcategoryController.categoryList. Это не тот список, который вы должны использовать. Вам нужен список с объектами categoryId, а не с объектами subcat. Попробуйте изменить что-то вроде этого.... ‹f:selectItems value=#{subcategoryController.categoryList} var=cat itemLabel=#{cat.categoryName} itemValue=#{#cat}/›, потому что в selectOneMenu его объект cat, поэтому selecteItems также должен иметь объект cat, а не объект subcat   -  person Kenshin    schedule 11.10.2016
comment
Нет пока, к сожалению. Я не знаю, что я делаю неправильно. Я продолжу расследование и, как только это будет сделано, я опубликую это здесь. Спасибо чувак. @Арун   -  person JVz    schedule 13.10.2016
comment
Задача решена. Я использовал неправильный объект в selectOneMenu. Я использую: subcategoryController.category.categoryId, и правильный, так как я работал с объектами подкатегории: subcategoryController.subcategory.categoryId   -  person JVz    schedule 31.10.2016


Ответы (2)


Изучив код, я понял, что использовал неправильный объект в JSF:

Например:

В вопросе я разместил: subcategoryController.category.categoryId для сохранения объекта Category в объекте subcategory.

Следующим образом:

<p:selectOneMenu id="cboCategoryDialog" converter="subcategoryConverter"
    value="#{subcategoryController.category.categoryId}"

Но правильный подход следующий:

<p:selectOneMenu id="cboCategoryDialog" converter="omnifaces.SelectItemsConverter"
    value="#{subcategoryController.subcategory.categoryId}"

Теперь этот компонент «указывает» на правильный объект.

Еще одна проблема, с которой я столкнулся:

Поскольку у меня есть вложенные объекты, например: Entity.entity.entity, они должны быть инициализированы на каждом уровне перед их использованием.

Некоторые сообщения, которые действительно, очень, очень помогли мне в этом:

При решении проблем с вложенными сущностями (PropertyNotFoundException).

Идентификация и решение javax.el.PropertyNotFoundException: Target Unreachable

При использовании обычного конвертера и конвертера OmniFaces в SelectOneMenu:

http://balusc.omnifaces.org/2007/09/objects-in-hselectonemenu.html

person JVz    schedule 31.10.2016

Убедитесь, что методы hashCode() и equals() вашего объекта реализованы и не пытаются получить доступ к полям, допускающим значение NULL. Это сработало для меня!

person Ramiro Alarcón    schedule 04.06.2018