h:selectOneListbox + a4j:ajax没有调用setter

时间:2012-11-05 23:07:49

标签: jsf richfaces ajax4jsf

我面临一个奇怪的问题,我有一个带有h: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 中选择一个项目时,不会调用setter webHostingServicesActions.customPackage.storage 。但是当我从 f:selectItem 中选择项目时,会正确调用setter。

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

当选择 f:selectItems 中的项目时,表单中的每个其他ajax操作都会被阻止。服务器端没有错误,在调试中使用 a4j:log 也没有错误。

编辑1 :当我从 f:selectItems 中选择项目时,会执行应用请求值的服务器端代码,但它会在二传手。我无法追踪到足以看到发生的事情。

编辑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 ,没有什么不同。

任何帮助表示感谢!

亚历山大。

1 个答案:

答案 0 :(得分:2)

现在我找到了解决方案,我对使用转换器与h:selectOneListbox存在误解。我当时认为转换器可用于从f:selectItems转换Object,反之亦然。

我稍微改回了我的代码:

<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>