2014-11-05 70 views
0

我建立一個自定義的valdiator在上傳的圖像 所以我做了以下做一些驗證:JSF H:INPUTFILE自定義的驗證是不是叫

<h:form styleClass="form" role="form" prependId="false" enctype="multipart/form-data"> 
      <h:inputFile styleClass="form-control" id="slideImage"> 
       <f:validator validatorId="NewImageValidator"/> 
      </h:inputFile> 
// Rest of form data & components 
</h:form> 

NewImageValidator.java

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

    @Override 
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
     System.out.println("NewImageValidator"); 

    } 
} 

問題是,在h:inputFile內部嘗試調用h:inputText內部的驗證程序並且它工作得很好 從來沒有調用驗證程序(NewImageValidator從不在輸出上打印)所以012有什麼問題這裏

在此先感謝

回答

0
<h:inputFile styleClass="form-control" id="slideImage"> 
    <f:validator validatorId="NewImageValidator"/> 
</h:inputFile> 

首先,你爲─不上h:inputFile使用value,因此,您的文件就不會被提交到任何BakingBean屬性,並傳遞到轉換器值將始終是null 實際上並非如此。驗證器仍然會取得正確的值,但是。如果你想繼續使用這個文件,你應該將它存儲在你的後臺bean中。

其次,您的表單缺少提交按鈕。如果您查看JSF LifeCycle,則在評估組件的值後(在提交表單後,用戶填寫數據(即提取文件時)而不是)後調用驗證

如果您想立即執行驗證,則無法繞過(部分) - 提交表單並將文件傳輸到服務器。根據大小,這可能是一個不好的方法。

博特爲目的,你可以使用f:ajax

<h:form styleClass="form" role="form" prependId="false" enctype="multipart/form-data"> 
    <h:inputFile value="#{myBean.uploadedFile}" styleClass="form-control" id="slideImage"> 
     <f:validator validatorId="NewImageValidator"/> 
     <f:ajax event="change" execute="slideImage" /> 
    </h:inputFile> 
</h:form> 

,但我寧願只傳送文件的用戶決定提交(使用普通的提交按鈕)。他可能會重新挑選幾個文件,並且在用戶改變主意時不需要上傳。

我認爲沒有客戶端驗證文件,因爲您的瀏覽器不允許任何客戶端腳本訪問文件系統上的未提交文件。

+0

確定表單提交按鈕只是爲了顯示問題 – YouYou 2014-11-06 01:15:24

+0

@YouYou對不起,不知道該代碼段是不完整的。那麼我只是用你的例子,它工作正常。你是否也刪除了其他屬性?例如'immediate =「true」'也會繞過驗證。請提供更多代碼以提供幫助。您現在提供的代碼段工作正常。像這樣,每個願意幫助的人都只能猜測出什麼是錯的。 – dognose 2014-11-06 20:06:51

+0

我寫的所有代碼都不少,這是奇怪的行爲,因爲它不是我第一次創建驗證器,但它是用於''h:inputFile'',但仍然不知道爲什麼? – YouYou 2014-11-09 10:39:28