Я заполняю <p:selectOneMenu/>
из базы данных следующим образом.
<p:selectOneMenu id="cmbCountry"
value="#{bean.country}"
required="true"
converter="#{countryConverter}">
<f:selectItem itemLabel="Select" itemValue="#{null}"/>
<f:selectItems var="country"
value="#{bean.countries}"
itemLabel="#{country.countryName}"
itemValue="#{country}"/>
<p:ajax update="anotherMenu" listener=/>
</p:selectOneMenu>
<p:message for="cmbCountry"/>
По умолчанию выбранная опция, когда эта страница загружена,
<f:selectItem itemLabel="Select" itemValue="#{null}"/>
Конвертер:
@ManagedBean
@ApplicationScoped
public final class CountryConverter implements Converter {
@EJB
private final Service service = null;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
try {
//Returns the item label of <f:selectItem>
System.out.println("value = " + value);
if (!StringUtils.isNotBlank(value)) {
return null;
} // Makes no difference, if removed.
long parsedValue = Long.parseLong(value);
if (parsedValue <= 0) {
throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "Message"));
}
Country entity = service.findCountryById(parsedValue);
if (entity == null) {
throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_WARN, "", "Message"));
}
return entity;
} catch (NumberFormatException e) {
throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "", "Message"), e);
}
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return value instanceof Country ? ((Country) value).getCountryId().toString() : null;
}
}
Когда выбран первый элемент из меню, представленный <f:selectItem>
, и форма отправляется затем, value
, полученный в методе getAsObject()
, равен Select
, который является меткой <f:selectItem>
- первой элемент в списке, который интуитивно не ожидается вообще.
Когда атрибут itemValue
<f:selectItem>
установлен в пустую строку, он выдает java.lang.NumberFormatException: For input string: ""
в методе getAsObject()
, даже если исключение точно поймано и зарегистрировано для ConverterException
.
Кажется, что это работает, когда инструкция return
getAsString()
изменена с
return value instanceof Country?((Country)value).getCountryId().toString():null;
к
return value instanceof Country?((Country)value).getCountryId().toString():"";
null
заменяется пустой строкой, но возвращает пустую строку, когда объект, о котором идет речь, null
, в свою очередь, несет другую проблему, как показано здесь.
Как сделать такие преобразователи работоспособными?
Также попытался с org.omnifaces.converter.SelectItemsConverter
, но это не имело значения.