如果发生 jsf 验证错误,是否可以执行一些操作(一些清理)?
字段使用 xhtml 中的标记进行验证,例如 'required="true"'、'f:validateRegex pattern="\d*"'、'f:validator validatorId="someValidator"'。
我需要将托管 bean 的某些属性字段设置为 null(当页面上有任何故障时)。
但是,如果验证失败,则 JSF 会进入呈现响应阶段并且不会调用托管 bean 方法。
在这种情况下也不会调用监听器(使用 f:actionListener 标记)。
现在我正在考虑通过使用 @AssertTrue、@Size 等 bean 注释进行验证来替换 xhtml 验证。
然后在某些验证方法中,可以进行清理:
@ManagedBean
class SomeBean {
...
@AssertTrue
public void isClenup() {
cleanup();
}
...
}
但这对我来说似乎不是一个好的解决方案。
我还注意到,以未定义的顺序调用了几个用@AssertTrue 注释的方法。因此,从 xhtml 验证切换到 bean 注释验证变得不那么容易了。
是否可以定义一些用@AssertTrue 注释的调用方法的顺序?
最佳答案
其实我有一个很普通的任务:有一个带有搜索功能的页面。
如果搜索成功且没有错误,则应显示结果,但如果发生验证错误(在下一次搜索期间),则不应显示先前的结果(但它是可见的,这是一个问题)。
我的计划如下:使用 facesContext.isValidationFailed() 检查 initialize() 方法中的验证失败,如果为真,则隐藏(删除)之前的搜索结果:
public void initialize() {
FacesContext context = FacesContext.getCurrentInstance();
boolean validationFailed = context.isValidationFailed();
if(validationFailed) {
clearPreviousSearchResult();
}
}
但后来我发现使用 bean 注释(如 @AssertTrue)的验证不会设置 facesContext.validationFailed();! IE。在此之后
@AssertTrue(message = "Some error message")
public boolean isValidateSomeField() {
return validate(getSomeFieldValue());
}
当失败发生时,你得到 context.isValidationFailed() == false(虽然我期望是真的)
(xhtml 验证或 validator 或 f:validator 按预期设置 facesContext.validationFailed())
因此需要手动设置上下文失败:
@AssertTrue(message = "Some error message")
public boolean isValidateSomeField() {
if(!validate(getSomeFieldValue())) {
FacesContext.getCurrentInstance().validationFailed();
return false;
}
return true;
}
但是由于How to check in after phase of Validations phase if validation has failed?我意识到问题可以更容易解决!只是用几行包裹:
<h:panelGroup rendered="#{!facesContext.validationFailed}">
...block not to show if validation errors occur...
</h:panelGroup>
并且无需使用注释 bean 验证和一些 initialize() 方法!
关于java - 发生 jsf 验证错误时执行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12859951/