我在创建/编辑表单上有这样的东西:
<h:selectOneMenu value="#{bean.value}" required="true" ... >
<f:selectItem itemLabel="-- Select --" itemValue=""/>
<f:selectItems .../>
</h:selectOneMenu>
在创建新对象的情况下,required
验证按预期工作。
在编辑对象的情况下,如果我将有效值更改为占位符“-- 选择--”,我会收到验证失败 w/预期的 requiredMessage,因为 itemValue 是空白(“”);但是,HTML<select>
将恢复为已从 bean 中选择的任何选项,而不是保留来自表单提交的无效用户输入。
重申一下,required=true
onh:selectOneMenu
本身可以正常工作,生成预期的消息 - 唯一错误的是值恢复为 bean 值,而不是保留空白提交值。(我通过 Chrome 开发人员工具栏确认确实为 POST 发布了一个空字符串<select>
。)
为什么会这样?更准确地说,为什么h:selectOneMenu
不表现得像h:inputText
UIInput 显示来自表单的无效用户输入,并且不从 bean 刷新其值?这两个控件都扩展了相同的 UIInput 基类并实现了 EditableValueHolder,因此我希望它们的生命周期表现相同。
另外,澄清一下,我在 web.xml 中的任何地方都没有INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL
上下文参数。
这是 Mojarra 2.1.3 / Glassfish 3.1.1 上的 JSF 应用程序。