在输入类型字段中,我有一个值绑定到jsp中value
属性的double
类型的变量(让我们调用foo
)。我有一个foo
的setter和getter,还有一个为这个输入注册的ValueChangedListener
。该字段的autosubmit
属性设置为true。当用户清除输入并导航到下一个字段时,valueChangedListener
内部的代码被调用,ValueChangedEvent
的newValue
变为空。我该如何防止这种情况发生?
我尝试从setter方法处理这个问题,但似乎没有调用setter,而是先调用valueChangedListener
。规范不是说应该首先调用setter来将用户编辑的值填充到组件中,然后只触发ValueChangedListener吗?
p.S:我使用ADF RichInputText作为输入,但我认为它与ADF无关,而是与核心JSF机制有关。因此,没有将其标记为民主同盟军问题。
我需要验证新值,而我对旧值不感兴趣
valueChangeListener
则是错误的作业工具。使用普通Validator
。为了验证空但必需的字段,请使用required="true"
。为了跳过空字段上的自定义验证器,请在web.xml
中添加以下上下文参数:
<context-param>
<param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
<param-value>false</param-value>
</context-param>
唯一的缺点是,这也会跳过@NotNull
/@NotBlank
JSR303 bean验证,但如果您无论如何都不使用它,这应该不会有什么害处。
还有为什么在
valueChangeListener
之前不会调用setter
因为旧的值会丢失,这将违背值更改侦听器的目的。
验证器会在valueChangedListener之前运行吗?我想只有当验证通过时,它才应该调用ValueChangedEvent,对吧
这是正确的。只有当组件通过验证(即UIInput#isValid()
返回true
)时,才会调用值更改侦听器。需要再次注意的是,当你对旧值不感兴趣时,值更改监听器很可能是你心目中工作的错误工具。