Я имею в виду, какие значения обязательно должны быть в конвертере?
Ничего. Преобразователь сам по себе не должен удерживать какое-либо состояние (конечно, ожидаемо от службы внедренного объекта / DAO).
getAsString()
должен просто напрямую возвращать уникальный идентификатор сущности, который, как предполагается, уже известен самой сущности. То есть это свойство самой сущности, которое может быть уникально представлено как String
.
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
Entity entity = (Entity) value;
return entity.getId() != null ? String.valueOf(entity.getId()) : null;
}
getAsObject()
должен просто возвращать объект, связанный с его уникальным идентификатором. Обычно это делается путем получения его от уровня обслуживания / DAO.
@Override
public String getAsObject(FacesContext context, UIComponent component, String value) {
Long id = Long.valueOf(value);
return entityService.find(id);
}
Альтернативой использованию службы / DAO в getAsObject()
является получение ее от <f:selectItems>
, чтобы избежать ненужных вызовов БД. См. Также Избегать лишних чтений БД в методе getAsObject класса конвертера путем кэширования данных на стороне клиента?