是否有必要在 JSF 自定义组件的 decode() 中调用 setValid(true)?
Is it necessary to invoke setValid(true) in decode() in a JSF Custom Component?
在使用自定义组件时我遇到了问题,UIInput#getValid()
永远不会自行重置。问题是:我是否必须在应用请求值阶段调用 setValid(true)
自己?
以下是我完成的步骤:
- 创建自定义组件并继承自
UIInput
- 组件在构造函数中调用
setConverter
- 转换器专为该组件设计,如果无法从字符串转换为模型对象,则会抛出
ConverterException
- 没有验证者
decode()
被覆盖,如果 FacesContext#isPostback
returns 为真,我们将使用请求值 调用 setSubmittedValue
- 在呈现响应期间,我检查
isValid()
,如果抛出 ConverterException
,它 returns 为真,我可以相应地呈现响应
- 但是:如果我提交另一个正确的值,则永远不会为自定义组件调用
setValid(true)
UIInput#decode()
的默认实现确实调用 EditableValueHolder#setValid()
和 true
。
所以你有两个选择:
- 只需在
UIInput#decode()
中调用 super.decode(context)
而不是手动获取提交的值并用它调用 setSubmittedValue()
(因为这已经是 UIInput#decode()
的默认行为)。
- 或者,在
UIInput#decode()
中手动调用 setValid(true)
,然后再调用 setSubimttedValue()
。
在使用自定义组件时我遇到了问题,UIInput#getValid()
永远不会自行重置。问题是:我是否必须在应用请求值阶段调用 setValid(true)
自己?
以下是我完成的步骤:
- 创建自定义组件并继承自
UIInput
- 组件在构造函数中调用
setConverter
- 转换器专为该组件设计,如果无法从字符串转换为模型对象,则会抛出
ConverterException
- 没有验证者
decode()
被覆盖,如果FacesContext#isPostback
returns 为真,我们将使用请求值 调用 - 在呈现响应期间,我检查
isValid()
,如果抛出ConverterException
,它 returns 为真,我可以相应地呈现响应 - 但是:如果我提交另一个正确的值,则永远不会为自定义组件调用
setValid(true)
setSubmittedValue
UIInput#decode()
的默认实现确实调用 EditableValueHolder#setValid()
和 true
。
所以你有两个选择:
- 只需在
UIInput#decode()
中调用super.decode(context)
而不是手动获取提交的值并用它调用setSubmittedValue()
(因为这已经是UIInput#decode()
的默认行为)。 - 或者,在
UIInput#decode()
中手动调用setValid(true)
,然后再调用setSubimttedValue()
。