我不太了解如何在JSF 2中有效地使用POJO/entity进行选择。例如,我正在尝试通过以下下拉框选择Warehouse
实体:
<h:selectOneMenu value="#{bean.selectedWarehouse}">
<f:selectItem itemLabel="Choose one .." itemValue="#{null}" />
<f:selectItems value="#{bean.availableWarehouses}" />
</h:selectOneMenu>
以下是管理的Bean:
@Named
@ViewScoped
public class Bean {
private Warehouse selectedWarehouse;
private List<SelectItem> availableWarehouses;
// ...
@PostConstruct
public void init() {
// ...
availableWarehouses = new ArrayList<>();
for (Warehouse warehouse : warehouseService.listAll()) {
availableWarehouses.add(new SelectItem(warehouse, warehouse.getName()));
}
}
// ...
}
请注意,我使用整个Warehouse
实体作为SelectItem
的值。当我提交表单时,将失败并显示以下面向用户的消息:
Conversion Error setting value 'com.example.Warehouse@cafebabe' for 'null Converter'.
我希望JSF在我用SelectItem
包装实体时可以正确地将Warehouse
对象设置到我的托管bean中。将实体包装在SelectItem
中旨在跳过为实体创建Converter
。
每当我想在我的<h:selectOneMenu>
中使用实体时,我真的必须使用一个Converter
吗?对于JSF而言,它应该能够从可用项列表中提取所选项。如果我真的必须使用转换器,那么实际操作是什么?到目前为止,我想到了这个:
- 为实体创建
Converter
实现。 - 覆盖
getAsString()
。我认为我不需要这个,因为SelectItem
的标签属性将用于显示下拉选项标签。 - 覆盖
getAsObject()
。我认为这将用于根据托管bean中定义的所选字段类型返回正确的SelectItem
或实体。
getAsObject()
让我感到困惑。如何高效地做到这一点?有了字符串值,我如何获取关联的实体对象?我应该基于字符串值从服务对象查询实体对象并返回实体吗?还是我可以以某种方式访问形成选择项的实体列表,循环它们以找到正确的实体,然后返回实体?
这个问题的正常解决方案是什么?
<f:converter converterId="MyCustomConverter"/>
无法定位转换器。现在,我该如何让它工作? - Joe Almore<f:converter converterId="ContactConverter" />
这一部分。感谢 @BalusC 指引我正确的方向。 - Roland