jsf - 如何对 p :fileUpload 进行验证

标签 jsf primefaces

除了 inputText 之外,页面上的强制组件之一是 p:fileUpload。所以当我点击提交时,<p:message>显示在具有 require=true 的组件上,但用户没有输入/选择

enter image description here

我想要红框Required也出现在上传组件旁边。这是我尝试过的。

1.当我设置required="true"时在 p:fileUpload 中,什么也没发生(不确定这是否是一个错误)。
2.我把validatorp:fileUpload ,下面是我的验证器来源

public void validateFileUpload(FacesContext context, UIComponent component,
       Object value) throws ValidatorException {
   if(value == null){
     FacesMessage message = new FacesMessage();
     message.setSeverity(FacesMessage.SEVERITY_ERROR);
     message.setSummary("Error");
     message.setDetail("Required");
     throw new ValidatorException(message);      
   }
}

当我点击“提交”时,实际上什么也没有发生,甚至当我完成上传时也没有发生,validateFileUpload根本没有被调用(不确定这是否是一个错误)

3.当我单击“提交”时,如果其他一切都通过,并且进入操作方法,我可以检查文件是否为空,然后返回 FacesMessage 并让 p:growl 拾取它。但是,我不喜欢这种方式,因为它给用户一种多层验证的感觉。

有没有办法对 p:fileUpload 进行更好的验证

最佳答案

对于那些有同样问题的人,我在创建向导时遇到了这个问题。我使用的解决方法是将上传的文件存储在我的 viewscoped bean 的一个字段中,并在尝试导航到下一步时检查该字段。

向导标签:

<p:wizard id="importBankAccountLogWizard"
            widgetVar="importBankAccountLogWizard"
            flowListener="#{bankAccountLogImportBean.onFlowProcess}">

文件上传标签(我设置了渲染和更新属性,以便在第一次上传后显示一条消息并隐藏上传的内容):

<p:fileUpload id="bankAccountLogFileInput"
                                      fileUploadListener="#{bankAccountLogImportBean.setBankAccountLogFile}"  
                                      rendered="#{bankAccountLogImportBean.renderFileUploadInput}"
                                      mode="advanced"  
                                      update="importBankAccountLogWizard"  
                                      auto="true"
                                      sizeLimit="1000000" />

bean :

public void setBankAccountLogFile(FileUploadEvent event)
{
    importFile = event.getFile();
    FacesMessage msg = new FacesMessage(Localization.g("FILE_HAS_BEEN_UPLOADED", event.getFile().getFileName()));
    FacesContext.getCurrentInstance().addMessage(null, msg);
}

public String onFlowProcess(FlowEvent event)
{
    if("bankAccountLogImportInputTab".equals(event.getOldStep()) &&
       importFile == null)
    {
        FacesMessage msg = new FacesMessage(Localization.g("UPLOAD_A_FILE_TO_CONTINUE"));
        FacesContext.getCurrentInstance().addMessage(null, msg);
        return event.getOldStep();
    }

    return event.getNewStep();
}

关于jsf - 如何对 p :fileUpload 进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9610272/

相关文章:

html - JSF 传递元素导致偏离结束标记

jsf - 在执行 JSF 托管 bean 操作时显示进度图像

java - 如何制作 primefaces 动态工具栏

JSF 动态资源路径

jsf - 如何将多个inputText映射到数组属性?

当托管 bean 构造函数发送 404 错误代码时,JSF 调用方法

jsf - 通过缓存数据客户端来避免转换器类的 getAsObject 方法中的额外数据库读取?

java - Primefaces 开关 p :autoComplete values

jsf和primefaces更新问题

spring-boot - 在primefaces上将selectManyButton与elasticSearch一起使用