Jsf PrimeFaces<;p:fileUpload模式=";“高级”&燃气轮机;验证程序未被激发

Jsf PrimeFaces<;p:fileUpload模式=";“高级”&燃气轮机;验证程序未被激发,jsf,file-upload,jsf-2,primefaces,validation,Jsf,File Upload,Jsf 2,Primefaces,Validation,由于fileLimit在primefaces 3.4中不再存在,我正在尝试实现一个验证器,问题是validate方法从未被调用。这是我的验证器: @FacesValidator(value ="fileLimitValidator") public class FileLimitValidator implements Validator { @Override public void validate(final FacesContext context, final UIC

由于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");
            }
        }
    }
}
在我的脸上我试过:

    <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>

以及:


以及:


以及:


但是validate方法从未被调用。正确的方法是什么?

根据和源代码,只有在使用
mode=“simple”
时才会调用验证器(注意:这反过来需要
ajax=“false”
on命令)。高级模式即不会将上传的文件设置为组件的提交值,导致它保持
null
,直到调用侦听器方法。只要提交的值为
null
,就不会调用验证程序

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

同时,尽管它是一种验证方法,但您最好的选择是在
fileUploadListener
方法中执行验证。您可以通过
FacesContext
触发验证失败添加faces消息,如下所示:

if (fail) {
    context.validationFailed();
    context.addMessage(event.getComponent().getClientId(context), new FacesMessage(
        FacesMessage.SEVERITY_ERROR, messageSummary, messageDetail));
}
否则,您需要为
创建一个自定义渲染器,该渲染器在
decode()
过程中设置提交的值(但我不能保证它在实践中会起作用,您可能会遇到一个特殊的问题,这可能是PrimeFaces最初没有这样实现它的原因)


顺便说一下,您的第一次和第二次验证尝试是正确的。第三次尝试仅在使用
@ManagedBean
而不是
@FacesValidator
()时有效。第四次尝试无效。

要在高级模式(ajax)下验证所需的primefaces文件上载,可以使用以下方法:

<f:metadata>
    <f:event listener="#{bean.processValidations()}" type="postValidate" />
</f:metadata>
如果
fileUploadsBean
将是一个请求范围的CDIBean(不适用于标准JSF ManagedBeans),您将它注入到定义了
processValidations()
方法的bean中,那么该方法
fileUploadsBean.getFileUploadComponent()
将返回primefaces文件上载组件(您将为此使用
)。方法
isfileupload()
将确定文件是否已上载(可能只是对从fileUploadListener填充的成员变量进行空检查)

如果你想突出显示文件上传按钮,你当然可以有条件地添加一个styleClass,你可以用它来添加一个红色边框

styleClass="#{fileUploadsBean.fileUploadComponent.valid ? '' : 'validationFailed'}"

因此,primefaces文件上载的验证失败消息将与所有其他jsf验证消息一起显示。您可能在维护验证消息的顺序时遇到问题(将始终位于末尾),但在用户处理了来自不同字段的所有标准jsf验证消息,并且您在支持bean中的操作最终完成之后,显示失败的上载文件验证仍然比显示失败的上载文件验证要好。

我认为这就是它的样子。我们看起来是您尝试过的事情之一:(),请确保您使用了正确的导入。然后我开始怀疑此组件可能不支持它。我尝试了h:inputText并调用了方法。@BalusC,以便验证(例如,我需要至少上载一个文件):如果
p:fileUpload
在表单中,并且用户只看到表单
commandButton
,如何触发fileUploadListener事件?非标准验证的最佳方法
if (fail) {
    context.validationFailed();
    context.addMessage(event.getComponent().getClientId(context), new FacesMessage(
        FacesMessage.SEVERITY_ERROR, messageSummary, messageDetail));
}
<f:metadata>
    <f:event listener="#{bean.processValidations()}" type="postValidate" />
</f:metadata>
public void processValidations() {
        FacesContext context = FacesContext.getCurrentInstance();
        UIInput fileUploadComponent = fileUploadsBean.getFileUploadComponent();
        if (fileUploadComponent!=null && !isFileUploaded()) {
            fileUploadComponent.setValid(false);
            context.addMessage(fileUploadComponent.getClientId(context), new FacesMessage(FacesMessage.SEVERITY_ERROR, messageSummary, messageDetail));
            context.validationFailed();
        }
    }
styleClass="#{fileUploadsBean.fileUploadComponent.valid ? '' : 'validationFailed'}"