我正在<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
。
当 the 的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
但没有任何区别。