JSF h:不调用inputFile自定义验证器

时间:2014-11-05 18:38:47

标签: java validation jsf jsf-2.2

我正在构建一个自定义valdiator来对上传的图像进行一些验证 所以我做了以下事情:

<h:form styleClass="form" role="form" prependId="false" enctype="multipart/form-data">  
          <h:inputFile  styleClass="form-control"  id="slideImage"> 
                 <f:validator validatorId="NewImageValidator"/>
          </h:inputFile>
// Rest of form data & components
</h:form>

NewImageValidator.java

@FacesValidator(value = "NewImageValidator")
public class NewImageValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        System.out.println("NewImageValidator");

    }
}

问题是调用器永远不会被调用(NewImageValidator永远不会在输出上打印)h:inputFile尝试在h:inputText内调用验证器并且它工作得很好 那么h:inputFile这里有什么问题

提前致谢

1 个答案:

答案 0 :(得分:0)

<h:inputFile  styleClass="form-control"  id="slideImage"> 
    <f:validator validatorId="NewImageValidator"/>
</h:inputFile>

首先,您在value上没有使用h:inputFile,因此您的文件不会被提交到任何BakingBean属性中,并且传递给转换器的值将始终为{{ 1}} 事实并非如此。验证器仍将获取正确的值,但是仍然是。如果你想继续使用该文件,你应该将它存储在你的支持bean中。

其次,您的表单缺少提交按钮。如果你看一下JSF LifeCycle,在评估了组件的值之后(在用户填写数据后提交表单,即选择文件时),将调用验证)

如果您想立即执行验证,则无法(部分) - 提交表单并将文件传输到服务器。根据大小,这可能是一个糟糕的方法。

为此目的,您可以使用null

f:ajax

但我更愿意只传输用户决定提交的文件(使用常规提交按钮)。他可能会重新选择几个文件,当用户改变主意时,您无需上传所有文件。

我认为没有客户端文件验证,因为您的浏览器不允许任何客户端脚本访问文件系统上未提交的文件。