PrimeFaces <p:fileUpload mode ="advanced">验证器未触发

par*_*anz 11 validation jsf file-upload primefaces jsf-2

由于fileLimit不存在于primefaces 3.4中,我正在尝试围绕实现验证器,问题是从不调用方法validate.那是我的验证者:

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

    @Override
    public void validate(final FacesContext context, final UIComponent component,
            final Object value) throws ValidatorException {

        final String fileLimit = (String)component.getAttributes().get("fileLimit");
        final String size = (String)component.getAttributes().get("size");

        if (fileLimit!=null && size!=null) {
            if (Integer.valueOf(size) >= Integer.valueOf(fileLimit)) {
                FacesUtils.throwErrorExceptionFromComponent(component,"fichero_confidencialidad_error");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的脸上,我试过了:

    <p:fileUpload id="#{id}FileUpload"
        fileUploadListener="#{bean[metodoTratarFichero]}" mode="advanced"
        multiple="true" allowTypes="#{allowTypes}" showButtons="false"
        update="#{id}ListaDocs #{id}MsgError" auto="true"
        label="#{fileuploadmsg.label_boton}"
        invalidFileMessage="#{fileuploadmsg.tipo_incorrecto}" >

        <f:validator validatorId="fileLimitValidator"/>
        <f:attribute name="fileLimit" value="#{fileLimit}"/>
        <f:attribute name="size" value="#{listaDocumentos.size}"/>
    </p:fileUpload>
Run Code Online (Sandbox Code Playgroud)

和:

    <p:fileUpload id="#{id}FileUpload"
        fileUploadListener="#{bean[metodoTratarFichero]}" mode="advanced"
        multiple="true" allowTypes="#{allowTypes}" showButtons="false"
        update="#{id}ListaDocs #{id}MsgError" auto="true"
        label="#{fileuploadmsg.label_boton}"
        invalidFileMessage="#{fileuploadmsg.tipo_incorrecto}" 
        validator="fileLimitValidator">

        <f:attribute name="fileLimit" value="#{fileLimit}"/>
        <f:attribute name="size" value="#{listaDocumentos.size}"/>
    </p:fileUpload>
Run Code Online (Sandbox Code Playgroud)

和:

    <p:fileUpload id="#{id}FileUpload"
        fileUploadListener="#{bean[metodoTratarFichero]}" mode="advanced"
        multiple="true" allowTypes="#{allowTypes}" showButtons="false"
        update="#{id}ListaDocs #{id}MsgError" auto="true"
        label="#{fileuploadmsg.label_boton}"
        invalidFileMessage="#{fileuploadmsg.tipo_incorrecto}" 
        validator="#{fileLimitValidator}">

        <f:attribute name="fileLimit" value="#{fileLimit}"/>
        <f:attribute name="size" value="#{listaDocumentos.size}"/>
    </p:fileUpload>
Run Code Online (Sandbox Code Playgroud)

和:

    <p:fileUpload id="#{id}FileUpload"
        fileUploadListener="#{bean[metodoTratarFichero]}" mode="advanced"
        multiple="true" allowTypes="#{allowTypes}" showButtons="false"
        update="#{id}ListaDocs #{id}MsgError" auto="true"
        label="#{fileuploadmsg.label_boton}"
        invalidFileMessage="#{fileuploadmsg.tipo_incorrecto}" 
        validator="#{fileLimitValidator.validate}">

        <f:attribute name="fileLimit" value="#{fileLimit}"/>
        <f:attribute name="size" value="#{listaDocumentos.size}"/>
    </p:fileUpload>
Run Code Online (Sandbox Code Playgroud)

但从未调用validate方法.这样做的正确方法是什么?

Bal*_*usC 15

根据FileUploadFileUploadRenderer源代码,验证器仅mode="simple"在使用时调用(注意:这反过来需要ajax="false"on命令).高级模式将不会将上载的文件设置为组件的提交值,从而使其保持null到调用侦听器方法为止.只要提交的值为null,就不会调用验证程序.

我不确定这是否是故意的.从理论上讲,应该可以设置UploadedFile为提交的值并让验证器依赖它.您可能希望在PrimeFaces问题跟踪器中创建增强报告.

与此同时,尽管它是一种糟糕的做法,但最好的办法是在fileUploadListener方法中进行验证.您可以通过FacesContext以下方式触发验证失败添加面部消息:

if (fail) {
    context.validationFailed();
    context.addMessage(event.getComponent().getClientId(context), new FacesMessage(
        FacesMessage.SEVERITY_ERROR, messageSummary, messageDetail));
}
Run Code Online (Sandbox Code Playgroud)

否则,你需要创建一个自定义渲染器来<p:fileUpload>设置提交的值decode()(我不保证它会在实践中起作用,你可能会偶然发现一个特殊的问题,可能会变成为什么PrimeFaces最初没有像那样实现它).

顺便说一句,您的第一次和第二次验证器尝试是正确的.第三次尝试只有在你使用@ManagedBean而不是@FacesValidator(通常在@EJB强制注入时才会这样做- 这在a中是不可能的@FacesValidator).第四次尝试无效.