如何在p:fileUpload上进行验证

时间:2012-03-07 22:42:09

标签: jsf primefaces

与couple inputText一起,我在页面上的一个必需组件是p:fileUpload。因此,当我点击提交时,<p:message>会显示在require=true的组件上,但用户未输入/选择

enter image description here

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

1。当我在p:fileUpload中设置required="true"时,没有发生任何事情(不确定这是否是一个错误)。
2。我将validator放在p: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 上做更好的验证?

1 个答案:

答案 0 :(得分:2)

对于那些有同样问题的人,我在创建向导时遇到了这个问题。我使用的解决方法是将上传的文件存储在我的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" />

豆:

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();
}