java - 发生 jsf 验证错误时执行操作

标签 java validation jsf

如果发生 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/

相关文章:

c# - 类似于带有定义 c# 的抽象的东西

java - jsf 中的 SelectBooleanCheckbox

python - 对动态设置的 MultipleChoiceField 进行验证,该字段最初为空?

jquery - IE 支持空白 :nowrap

java - JSF带参数重定向到其他页面

java - hibernate + jsf + spring 的缓存提供程序

java - 我可以让记事本不对我的文件进行编码吗?

java - 从对象引用访问父类(super class)方法(新手)

java - 如何使用 opencsv 将整数值写入 csv 文件

java - 'source code does not match the bytecode' 使用IDEA调试JdbcTemplate