我正從數據庫填充<p:selectOneMenu/>
,如下所示。使用「請選擇」f:selectItem在p:selectOneMenu中使用null /空值
<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>
表示的菜單中的第一項和所述然後提交表格,getAsObject()
方法中獲得的value
爲Select
,這是的標籤- 列表中的第一個項目,根本沒有預料到。
當<f:selectItem>
的itemValue
屬性設置爲空字符串,然後,它在即使異常精確捕捉和ConverterException
註冊getAsObject()
方法拋出java.lang.NumberFormatException: For input string: ""
。
這在某種程度上似乎是工作,當getAsString()
的return
語句從
return value instanceof Country?((Country)value).getCountryId().toString():null;
改爲
null
由一個空字符串替換,但是當對象返回一個空字符串問題是null
,反過來又引發另一個問題,如演示here。
如何使這種轉換器正常工作?
也嘗試與org.omnifaces.converter.SelectItemsConverter
但它沒有區別。
你有沒有考慮過這個''? –
在這篇文章之前 - 一年前,我曾嘗試使用'noSelectionOption =「true」',但它似乎也沒有任何區別。 – Tiny