Конвертер предоставляет механизм для преобразования POJO в представление String (HTML), а затем преобразовывает эту строку обратно в экземпляр того же POJO. В вашем примере вы не хотите выдавать исключение, а просто возвращаете ноль, когда Book равен нулю.
Одна вещь, которую я часто делаю в своем приложении, - это создание универсального конвертера, который работает для всех моих selectItems. Это легко, если все ваши сущности реализуют общий интерфейс, например, со свойством id.
public interface Entity extends Serializable {
/**
* Return the primary key for this entity
*
* @return id
*/
public BigInteger getId();
}
Затем вы можете создать соглашение о том, как все сущности должны быть преобразованы в строку и обратно в объект. Обычно я объединяю имя класса и идентификатор, а затем кодирую их в Base64, чтобы преобразовать объект в строку и затем обратить преобразование:
/*
* (non-Javadoc)
* @see javax.faces.convert.Converter#getAsObject(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.String)
*/
@SuppressWarnings("unchecked")
public Object getAsObject(FacesContext context, UIComponent component, String value) {
Object objectValue = null;
try {
BigInteger id = null;
value = this.unhash(value);
String[] array = value.split(CLASS_KEY_SEPARATOR);
if (array.length == 2) {
id = new BigInteger(array[1]);
}
Collection<UIComponent> childComponents = component.getChildren();
for (UIComponent childComponent : childComponents) {
if (childComponent.getClass().equals(UISelectItems.class)) {
Collection<Entity> values =
(Collection<Entity>) childComponent.getValueExpression("value").getValue(FacesContext.getCurrentInstance().getELContext());
for (Entity selectItemValue : values) {
if (id.equals(selectItemValue.getId())) {
return selectItemValue;
}
}
}
}
} catch (Exception ex) {
LOGGER.error(ex.getMessage(), ex);
}
return objectValue;
}
Ваша структура сущностей может отличаться от моей, но если вы следуете базовому шаблону, у вас есть конвертер, который работает для всех POJO в вашем приложении, представленных как SelectItems.