Значение настройки ошибки преобразования для 'null Converter '- Зачем мне нужен конвертер в JSF?

У меня проблемы с пониманием того, как эффективно использовать выделение в JSF 2 с POJO / entity. Например, я пытаюсь выбрать сущность Warehouse в раскрывающемся ниже списке:

<h:selectOneMenu value="#{bean.selectedWarehouse}">
    <f:selectItem itemLabel="Choose one .." itemValue="#{null}" />
    <f:selectItems value="#{bean.availableWarehouses}" />
</h:selectOneMenu>

И управляемый bean-компонент ниже:

@Named
@ViewScoped
public class Bean {

    private Warehouse selectedWarehouse;
    private List<SelectItem> availableWarehouses;

    // ...

    @PostConstruct
    public void init() {
        // ...

        availableWarehouses = new ArrayList<>();

        for (Warehouse warehouse : warehouseService.listAll()) {
            availableWarehouses.add(new SelectItem(warehouse, warehouse.getName()));
        }
    }

    // ...
}

Обратите внимание, что я использую всю сущность Warehouse как значение SelectItem .

Когда я отправляю форму, это не удается со следующим сообщением:

Значение параметра «Ошибка преобразования»com.example.Warehouse@cafebabe'для' null Converter '.

Я надеялся, что JSF сможет просто установить правильный объект Warehouse для моего управляемого bean-компонента, когда я заключу его в SelectItem . Помещение моей сущности в SelectItem означало пропустить создание Converter для моей сущности.

Мне действительно нужно использовать Converter , когда я хочу использовать сущности в моем ? Для JSF должно быть возможно просто извлечь выбранный элемент из списка доступных элементов. Если мне действительно нужно использовать конвертер, как это сделать на практике? Пока я подошел к следующему:

  1. Создайте реализацию Converter для объекта.
  2. Переопределите getAsString () . Я думаю я не В этом нет необходимости, поскольку свойство метки SelectItem будет использоваться для отображения метки раскрывающегося списка.
  3. Переопределение getAsObject () . Я думаю, это будет использоваться для возврата правильного SelectItem или объекта в зависимости от типа выбранного поля, определенного в управляемом компоненте.

getAsObject () меня смущает. Как это сделать эффективнее? Имея строковое значение, как мне получить связанный объект сущности? Должен ли я запрашивать объект сущности из объекта службы на основе строкового значения и возвращать сущность? Или, возможно, каким-то образом я могу получить доступ к списку сущностей, которые образуют элементы выбора, зациклить их, чтобы найти правильную сущность, и вернуть объект?

Каков обычный подход?

38
задан BalusC 20 March 2018 в 09:29
поделиться