【发布时间】:2021-11-22 10:24:14
【问题描述】:
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;
}
}
BaseDTO
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 变量是Map<String, String> 而不是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。
这是预期的组件行为,还是我遗漏了什么?
提前感谢您的帮助!
【问题讨论】:
-
我建议使用实体类,如“Item”、“Entry”或其他实体类(不一定是 JPA 实体类)和存储库(有时也称为服务),而不是 BaseDTO您可以从中访问实体的 ItemRepo 或 ItemService。然后,您可以将 repo/service 注入您的支持 bean MyBean 并在 @PostConstruct 方法中填充实体列表。如果您发布自定义转换器的代码也会很有帮助。
-
我的 BaseDTO 类是一个 POJO(不是 JPA 实体类),它将数据从持久层传送到视图。 MyBean 上的 List 变量是使用服务填充的,就像您建议的那样 - 为了清楚起见,我的示例进行了简化。请注意,如果我删除 noSelectionOption,一切正常。
标签: validation jsf converters mojarra selectmanylistbox