【问题标题】:p:fileUpload required="true" and custom validator doesn't work [duplicate]p:fileUpload required="true" 和自定义验证器不起作用 [重复]
【发布时间】:2013-11-12 09:44:11
【问题描述】:

由于<p:fileUpload>required 属性在PrimeFaces 4.0 final 中似乎仍然不起作用,因此我尝试创建一个自定义验证器,如下所示。

@FacesValidator(value="fileUploadValidator")
public final class FileUploadValidator implements Validator
{
    @Override
    public void validate(FacesContext fc, UIComponent uic, Object o) 
    throws ValidatorException
    {
        System.out.println("fileUploadValidator called.");

        if(!(o instanceof UploadedFile))
        {
            FacesMessage message = new FacesMessage();
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            message.setSummary("Error");
            message.setDetail("Required");
            throw new ValidatorException(message);      
        }
    }
}

并用<p:fileUpload>指定。

<p:fileUpload mode="advanced" 
              required="true"
              multiple="true"
              allowTypes="/(\.|\/)(gif|jpe?g|png)$/"
              fileUploadListener="#{bean.fileUploadListener}">
    <f:validator validatorId="fileUploadValidator"/>
</p:fileUpload>

但 validate 方法从未被调用过。由于我在&lt;p:dataGrid&gt; 中显示图像,因此非常需要此验证。有没有办法验证一个空的&lt;p:fileUpload&gt;

【问题讨论】:

  • 我还没有查看 4.0 的源代码,但以下 3.4 的答案可能也适用于 4.0:stackoverflow.com/questions/13865136/…
  • @BalusC :有什么解决方法吗?这当然可以在相应的 JSF 托管 bean 中进行检查,以查看 UploadedFile 对象是否为 null 但这样做会导致一些 JSF/PrimeFaces 组件(如 &lt;p:dataTable&gt;)不必要地更新,这反过来又会导致一些对数据库进行昂贵的查询,这是完全错误和笨拙的。
  • 理论上,自定义渲染器应该可以。如果不检查来源,就无法从头顶上分辨出来。

标签: validation jsf primefaces jsf-2.2


【解决方案1】:

试试这个

@ManagedBean(name = "docBean")
@ViewScoped
public class DocumentBean implements Serializable
{
  private UploadedFile file;

  public void handleFileUpload(FileUploadEvent event)
  {
     uploadedFile = event.getFile();
   }

   //action
   public void viewImage()
  {
    if(uploadFile==null){
     FacesContext saveContext = FacesContext.getCurrentInstance();
     saveContext.addMessage(null, new FacesMessage("Error", "Upload file  required"));
   }
 }
}

【讨论】:

  • 这肯定可以在托管 bean 中完成,但毕竟它不是一个验证器,它在托管 bean 中的任何关联属性/字段被填充之前被调用并执行其工作。
猜你喜欢
  • 1970-01-01
  • 2012-08-25
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多