我面临一个奇怪的问题,我有一个带有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 ,没有什么不同。
任何帮助表示感谢!
亚历山大。
答案 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>