【问题标题】:JSF h:inputFile custom validator is not calledJSF h:inputFile 自定义验证器未被调用
【发布时间】:2015-01-02 01:58:24
【问题描述】:

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

<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");

    }
}

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

提前致谢

【问题讨论】:

    标签: java validation jsf jsf-2.2


    【解决方案1】:
    <h:inputFile  styleClass="form-control"  id="slideImage"> 
        <f:validator validatorId="NewImageValidator"/>
    </h:inputFile>
    

    首先,您没有在 h:inputFile 上使用 value,因此您的文件将不会提交到任何 BakingBean 属性中,并且传递给转换器的值将始终为 null。 s> 实际上这不是真的。验证器仍然会拾取正确的值,但是 ofc。如果你想继续使用这个文件,你应该把它存储在你的 backing bean 中。

    其次,您的表单缺少提交按钮。如果您查看 JSF LifeCycle,则会在评估组件的值之后调用验证(在提交表单后,不是,而用户填写数据,即选择文件)

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

    为此,您可以使用 Bot f:ajax

    <h:form styleClass="form" role="form" prependId="false" enctype="multipart/form-data">  
        <h:inputFile value="#{myBean.uploadedFile}" styleClass="form-control"  id="slideImage"> 
            <f:validator validatorId="NewImageValidator"/>
            <f:ajax event="change" execute="slideImage" /> 
        </h:inputFile>
    </h:form>
    

    但我更愿意只传输用户决定提交的文件(使用常规提交按钮)。他可能会重新挑选几个文件,当用户改变主意时,您不需要全部上传它们。

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

    【讨论】:

    • 确定表单有提交按钮只是为了显示问题
    • @YouYou 抱歉,不知道 sn-p 不完整。好吧,我刚刚使用了您的示例,并且运行良好。您是否还删除了任何其他属性?例如immediate="true" 也将绕过验证。请提供更多代码以提供帮助。您现在提供的 sn-p 工作正常。这样一来,每个愿意帮忙的人都只能出了什么问题。
    • 我写的所有代码都没有,这是奇怪的行为,因为这不是我第一次制作验证器,但它是为h:inputFile 写的,但仍然不知道为什么?
    猜你喜欢
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 2016-12-04
    • 2013-11-15
    • 1970-01-01
    相关资源
    最近更新 更多