“空转换器”的转换错误设置值-为什么我需要JSF中的转换器?

“空转换器”的转换错误设置值-为什么我需要JSF中的转换器?

我在理解如何在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@ViewScopedpublic 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.

当我提交表单时,以下Faces消息失败:

转换错误设置值‘com.example.Warehouse@caebabe’空转换器‘。

我希望JSF能设置正确的Warehouse对象打包到托管bean中。SelectItem..将我的实体包装在SelectItem应该跳过创建Converter为了我的实体。

我真的需要用Converter每当我想使用<h:selectOneMenu>?对于JSF来说,只需从可用项列表中提取所选的项就可以了。如果我真的要用转换器,实际的方法是什么?到目前为止,我想到的是:

  1. 创建一个

    Converter

    实体的实施。
  2. 覆盖

    getAsString()

    ..我想我不需要这个,因为

    SelectItem

    将用于显示下拉选项标签。
  3. 覆盖

    getAsObject()

    ..我认为这将用于返回正确的

    SelectItem

    或实体,取决于在托管bean中定义的选定字段的类型。

这个getAsObject()把我弄糊涂了。做这件事的有效方法是什么?具有字符串值时,如何获得关联的实体对象?应该根据字符串值从服务对象查询实体对象并返回该实体吗?或者也许我可以访问组成选择项的实体的列表,循环它们以找到正确的实体,并返回该实体?

这样做的正常方式是什么?


慕码人8056858
浏览 607回答 2
2回答
打开App,查看更多内容
随时随地看视频慕课网APP