У меня проблемы с пониманием того, как эффективно использовать выбор в JSF 2 с POJO/сущностью. Например, я пытаюсь выбрать объект 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
.
Когда я отправляю форму, это происходит с сообщением следующих лиц:
Значение ошибки конверсии '[email protected]' для 'null Converter'.
Я надеялся, что JSF может просто установить правильный объект Warehouse
для моего управляемого bean, когда я оберну его в SelectItem
. Обертка моего объекта внутри SelectItem
означала пропустить создание Converter
для моего объекта.
Нужно ли мне использовать Converter
, когда я хочу использовать объекты в моем <h:selectOneMenu>
? Для JSF необходимо просто извлечь выбранный элемент из списка доступных элементов. Если мне действительно нужно использовать конвертер, какой практический способ это сделать? До сих пор я подошел к этому:
- Создайте реализацию
Converter
для объекта. - Переопределение
getAsString()
. Я думаю, что мне это не нужно, так как свойство меткиSelectItem
будет использоваться для отображения метки выпадающего списка. - Переопределение
getAsObject()
. Я думаю, что это будет использоваться для возврата правильногоSelectItem
или объекта в зависимости от типа выбранного поля, определенного в управляемом bean.
getAsObject()
меня смущает. Каков эффективный способ сделать это? Имея строковое значение, как мне получить связанный объект объекта? Должен ли я запрашивать объект объекта из объекта службы на основе значения строки и возвращать объект? Или, возможно, каким-то образом я могу получить доступ к списку объектов, которые формируют элементы выбора, зацикливать их, чтобы найти правильный объект, и вернуть объект?
Каков нормальный подход?