我有一个问题h:selectManyListbox
,当项目中填充了 POJO 并且noSelectionOption
为真时(对于h:selectManyListbox
枚举作为项目,它按我的预期工作)。
豆
@Named
@ViewScoped
public class MyBean implements Serializable {
private static final long serialVersionUID = 1L;
private List<BaseDTO> availableItems = null;
private String[] selectedItems = null;
@PostConstruct
private void initialize() {
loadAvailableItems();
}
private void loadAvailableItems() {
availableItems = Arrays.asList(new BaseDTO("entityId", "entityDescription"), new BaseDTO(...), ...);
}
public List<BaseDTO> getAvailableItems() {
return availableItems;
}
public String[] getSelectedItems() {
return selectedItems;
}
public void setSelectedItems(String[] selectedItems) {
this.selectedItems = selectedItems;
}
}
基础DTO
public class BaseDTO {
private String id;
private String description;
public BaseDTO(String id, String description) {
this.id = id;
this.description = description;
}
public String getId() {
return id;
}
public String getDescription() {
return description;
}
@Override
public String toString() {
return id;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id.hashCode();
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
BaseDTO other = (BaseDTO) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
}
XHTML
<h:selectManyListbox value="#{myBean.selectedItems}" hideNoSelectionOption="false" size="4">
<f:selectItem itemValue="#{null}" itemLabel="--" noSelectionOption="true" />
<f:selectItems value="#{myBean.availableItems}" var="entry" itemValue="#{entry.id}" itemLabel="#{entry.description}" />
</h:selectManyListbox>
当我尝试提交页面时,我总是得到Validation Error: Value is not valid
. 如果我删除hideNoSelectionOption
和相应的<f:selectItem itemValue="#{null}" itemLabel="--" noSelectionOption="true" />
一切正常,但我真的很想把它noSelectionOption
放在我的清单上。
我尝试使用 OmniFaces SelectItemsConverter 甚至创建自己的自定义转换器,但没有运气。无论我尝试什么,我都无法克服这个验证错误。
同时我发现了一个不太好的解决方法:
如果我的availableItems
变量是 aMap<String, String>
而不是 a List
:
private Map<String, String> availableItems = null;
如果我向地图添加一个空条目:
private void loadAvailableItems() {
List<BaseDTO> dtoList = Arrays.asList(new BaseDTO("entityId", "entityDescription"));
availableItems = dtoList.stream().collect(Collectors.toMap(BaseDTO::getId, BaseDTO::getDescription));
availableItems.put(null, "--");
}
然后,一切都按预期工作,除了noSelectionOption
页面上没有预先选择。
这是预期的组件行为,还是我遗漏了什么?
在此先感谢您的帮助!