Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 发生jsf验证错误时执行操作_Java_Validation_Jsf - Fatal编程技术网

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

Java 发生jsf验证错误时执行操作,java,validation,jsf,Java,Validation,Jsf,如果发生jsf验证错误,是否可以执行一些操作(一些清理) 使用xhtml中的标记验证字段,例如“required=”true“,“f:validateRegex pattern=“\d*”,“f:validator validator id=”someValidator“。 我需要将托管bean的某些属性字段设置为null(当页面上出现任何失败时)。 但若验证失败,那个么JSF将进入呈现响应阶段,并且不会调用托管bean方法。 侦听器(使用f:actionListener标记)在这种情况下也不会

如果发生jsf验证错误,是否可以执行一些操作(一些清理) 使用xhtml中的标记验证字段,例如“required=”true“,“f:validateRegex pattern=“\d*”,“f:validator validator id=”someValidator“。
我需要将托管bean的某些属性字段设置为null(当页面上出现任何失败时)。 但若验证失败,那个么JSF将进入呈现响应阶段,并且不会调用托管bean方法。 侦听器(使用f:actionListener标记)在这种情况下也不会被调用。

现在我正在考虑用诸如@AssertTrue、@Size等bean注释来代替xhtml验证。 然后,在某些验证方法中,可以进行清理:

@ManagedBean
class SomeBean {
...
    @AssertTrue
    public void isClenup() {
        cleanup();
    }
...
}
但对我来说,这似乎不是一个好的解决办法
我还注意到,有几个用@AssertTrue注释的方法是按未定义的顺序调用的。因此,从xhtml验证切换到bean注释验证并不容易。

是否可以定义以@AssertTrue注释的调用方法的顺序?

如果在JSF验证阶段引发验证异常,则提交的表单值将不会应用于模型。另外,在调用应用程序JSF阶段执行的所有被调用事件都不会被调用。但是,您会注意到渲染仍然会发生,任何需要渲染或更新的组件仍然会这样做

从理论上讲,如果任何用户提交无效,这应该足以回滚大多数用户提交,但是有一些边缘情况需要进行额外的清理。然而,我敦促您首先仔细评估导致您满足此需求的设计决策,因为可能有更好的方法来满足您的业务需求,而不必求助于此

话虽如此,我将执行一个预呈现事件,该事件将在每次回发时执行,并检查某些验证,并执行必要的业务和表示逻辑

<f:event listener="#{managedBean.initialize()}" type="preRenderView" />

事实上,我有一个非常普通的任务:有一个带有搜索功能的页面。
搜索成功且无错误时,应显示结果,但如果出现验证错误(在下一次搜索期间),则不应显示以前的结果(但它是可见的,这是一个问题)。

我的计划如下:使用facesContext.isValidationFailed()检查initialize()方法中的验证失败,如果是真的,则隐藏(删除)以前的搜索结果:

public void initialize() {
    FacesContext context = FacesContext.getCurrentInstance();
    boolean validationFailed = context.isValidationFailed();
    if(validationFailed) {
        clearPreviousSearchResult();
    }
}
但后来我发现,使用bean注释(如@AssertTrue)进行验证并没有设置facesContext.validationFailed();! 即在这之后

@AssertTrue(message = "Some error message")
public boolean isValidateSomeField() {
    return validate(getSomeFieldValue());
}
当发生失败时,您将获得context.isValidationFailed()==false(尽管我预期为true)
(xhtml验证或验证程序或f:validator按预期设置facesContext.validationFailed())

因此,有必要手动设置上下文失败:

@AssertTrue(message = "Some error message")
public boolean isValidateSomeField() {
    if(!validate(getSomeFieldValue())) {
        FacesContext.getCurrentInstance().validationFailed();
        return false;
    }
    return true;
}
但是由于我意识到这个问题可以更容易地解决!仅用几行文字来概括:

<h:panelGroup rendered="#{!facesContext.validationFailed}">
    ...block not to show if validation errors occur...
</h:panelGroup>

…块不显示是否发生验证错误。。。
而且不需要使用注释bean验证和一些initialize()方法