在输入类型字段中,我有一个值绑定到我的jsp中foo
属性的double
类型的变量(允许调用value
)。我为foo
设置了一个setter和一个getter,并且还为此输入注册了ValueChangedListener
。该字段的autosubmit
属性设置为true。当用户清除输入并导航到下一个字段时,valueChangedListener
中的代码将被调用,newValue
的{{1}}将变为空。我怎么能阻止这个?
我尝试从setter方法处理这个问题,但似乎没有调用setter并且首先调用ValueChangedEvent
。规范是否应该首先调用setter来将用户编辑的值填充到组件中,然后才会触发ValueChangedListener?
P.S:我使用ADF RichInputText作为输入,但我认为它与ADF无关,而是与核心JSF机制有关。因此,不要将其标记为ADF问题。
答案 0 :(得分:1)
我需要验证新值,我对旧值不感兴趣。
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
)。值得注意的是,当你对旧价值不感兴趣时,价值变化倾听者很可能是你想到的工作的错误工具。