1

我面临一个奇怪的问题,我有一个带有 ah:selectOneListbox 的表单:

<h:selectOneListbox value="#{webHostingServicesActions.customPackage.storage}" size="1">
    <f:selectItem itemLabel="None" itemValue="#{null}" />
    <f:selectItems value="#{webHostingServicesActions.storagesChoices}" var="item" itemLabel="#{item.name}" />
    <f:converter converterId="productConverter" />
    <a4j:ajax event="valueChange" render="lblTotal" />
</h:selectOneListbox>

当我从f:selectItems中选择一项时,设置器webHostingServicesActions.customPackage.storage不会被调用。但是当我从f:selectItem中选择项目时,setter 会被正确调用。

当然,我使用的是自定义转换器,但它已经过测试并且响应正确。

Every other ajax actions in the form seems blocked when an item from f:selectItems is selected. 服务器端没有错误,使用a4j:log调试也没有错误。

编辑 1:当我从f:selectItems中选择一个项目时,会执行应用请求值的服务器端代码,但它会在 setter 之前的某处阻塞。我无法追踪到足够远的地方来查看正在发生的事情。

编辑 2:我添加了 BalusC LifeCycleListener ...

当我从f:selectItem中选择项目时

START PHASE RESTORE_VIEW 1
END PHASE RESTORE_VIEW 1
START PHASE APPLY_REQUEST_VALUES 2
END PHASE APPLY_REQUEST_VALUES 2
START PHASE PROCESS_VALIDATIONS 3
END PHASE PROCESS_VALIDATIONS 3
START PHASE UPDATE_MODEL_VALUES 4
END PHASE UPDATE_MODEL_VALUES 4
START PHASE INVOKE_APPLICATION 5
END PHASE INVOKE_APPLICATION 5
START PHASE RENDER_RESPONSE 6
END PHASE RENDER_RESPONSE 6

当我从f:selectItems中选择一个项目时

START PHASE RESTORE_VIEW 1
END PHASE RESTORE_VIEW 1
START PHASE APPLY_REQUEST_VALUES 2
END PHASE APPLY_REQUEST_VALUES 2
START PHASE PROCESS_VALIDATIONS 3
END PHASE PROCESS_VALIDATIONS 3
START PHASE RENDER_RESPONSE 6
END PHASE RENDER_RESPONSE 6

我还测试了更改而不是valueChange,没有什么不同。

任何帮助表示感谢!

亚历山大。

4

1 回答 1

2

现在我找到了解决方案,我对将转换器与 h:selectOneListbox 一起使用有一个误解。我在想转换器可用于从 f:selectItems 转换对象,反之亦然。

我改变了我的代码:

<h:selectOneListbox value="#{webHostingServicesActions.selectedStorage}" size="1">
    <f:selectItem itemLabel="Aucun" itemValue="#{null}" />
    <f:selectItems value="#{webHostingServicesActions.storagesChoices}" var="item" itemLabel="#{item.name}" itemValue="#{item.keyProduct}" />
    <f:converter converterId="integerConverter" />
    <a4j:ajax event="valueChange" render="lblTotal" />
</h:selectOneListbox>

现在 setter selectedStorage将收到一个Integer而不是一个对象Product。一切正常。

感谢 kolossus 让我走上了正确的道路和这篇文章:Object as itemValue in <f:selectItems>

于 2012-11-07T06:37:27.240 回答