2013-08-05 89 views
1

我在名爲EmailValidator的包「com.travstar.validators」中的項目中創建了一個驗證程序。未找到JSF驗證程序

內容類:

package com.travstar.validators; 

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

import javax.faces.application.FacesMessage; 
import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.validator.FacesValidator; 
import javax.faces.validator.Validator; 
import javax.faces.validator.ValidatorException; 

@FacesValidator("emailValidator") 
public class EmailValidator implements Validator 
{ 
    private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-]+(\\." + 
      "[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*" + 
      "(\\.[A-Za-z]{2,})$"; 

    private Pattern pattern; 
    private Matcher matcher; 

    public EmailValidator() 
    { 
     pattern = Pattern.compile(EMAIL_PATTERN); 
    } 

    @Override 
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException 
    { 

     matcher = pattern.matcher(value.toString()); 
     if (!matcher.matches()) 
     { 

      FacesMessage msg = new FacesMessage("Email validation failed.", "Invalid Email format."); 
      msg.setSeverity(FacesMessage.SEVERITY_ERROR); 
      throw new ValidatorException(msg); 
     } 
    } 
} 

,我實現電子郵件驗證這樣的:

<h:panelGrid columns="1" width="100%"> 
        <h:outputText value="Email Address"></h:outputText> 
        <h:inputText id="emailAddress" value="#{passengerDetailsBean.contactDetails.emailAddress}" styleClass="input-block-level" placeholder="" required="true"> 
         <f:validator validatorId="emailValidator"></f:validator> 
        </h:inputText> 
        <h:message for="emailAddress" styleClass="alert alert-error" /> 
       </h:panelGrid> 

這或多或少是完全一樣的教程我在網上找到,但我沒有能夠得到它的工作。

我打網頁的時候,下面的異常被拋出:

javax.servlet.ServletException: Unknown validator id 'emailValidator' 

我使用JSF 2.1,所以據我知道我不需要用在faces-config.xml撥弄

任何人有任何想法,爲什麼發生這種情況?

+1

爲了避免顯而易見,您是否正確清理/重建/重新部署/重新啓動項目和服務器?如果您已經使用了註釋,那麼在faces-config.xml中註冊並不是必需的。在一個不相關的說明中,由於2010年半年的非拉丁字符被允許在域名中,因此也允許電子郵件地址。因此,只匹配拉丁字符的正則表達式模式被嚴重破壞。 – BalusC

+0

@BalusC謝謝 - 是的,我做了清理和重新部署。 正則表達式模式現在是一個簡單的佔位符 - 一旦我得到它的工作,我會尋找regexlib.com上一個更寬容的:) – Skytiger

+1

然後我不知道。 'ClassNotFoundException'顯然意味着類不在classpath中。假設您沒有任何拼寫錯誤,這隻能表示該項目未正確構建/部署,或者您只是沒有運行您認爲正在運行的代碼。在服務器的deploy文件夾中進行潛水,並瀏覽是否在預期位置看到「EmailValidator.class」。例外情況表明它不在那裏。 – BalusC

回答

1

顯然,目標服務器正在積極緩存其部署/工作文件夾,而不是立即注意到任何外部更改。你在使用哪一個?它有一種「發展」和「生產」階段的設置嗎?將其設置爲開發。

+0

它已設置爲生產 - 我將其設置爲開發並且它是工作區現在好,謝謝一堆! – Skytiger