2011-03-04 155 views
2

我想驗證輸入到我的託管bean中的JSF頁面,但由於某些原因它不起作用?JSF 2.0自定義驗證問題

@ManagedBean 
@RequestScoped 
public class RegistrationController { 
//values passed from the JSF page 
private String name; 
... 
public void validateName(FacesContext context, UIComponent validate, 
     Object value) { 
    String inputFromField = (String) value; 
    String simpleTextPatternText = "^[a-zA-Z0-9]+$"; 
    Pattern textPattern = null; 
    Matcher nameMatcher = null; 
    textPattern = Pattern.compile(simpleTextPatternText); 
    nameMatcher = textPattern.matcher(getName()); 

    if (!nameMatcher.matches()) { 
     ((UIInput) validate).setValid(false); 
     FacesMessage msg = new FacesMessage(
       "your name cant contain special characters"); 
     context.addMessage(validate.getClientId(), msg); 
    } 
} 

這是輸入組件的樣子(內部形式):

<h:inputText value="#{registrationController.name}" validator="#{registrationController.validateName}" required="true"> 
     <h:message for="nameInput"/> 

當我輸入了錯誤輸入我沒有看到驗證信息,並在控制檯中我看到這個:

INFO: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver. INFO: WARNING: FacesMessage(s) have been enqueued, but may not have been displayed. sourceId=bRegForm:j_idt7[severity=(ERROR 2), summary=(bRegForm:j_idt7: Validation Error: Value is required.), detail=(bRegForm:j_idt7: Validation Error: Value is required.)]

它可能是什麼?我忘了什麼嗎?我必須添加一些東西到我的配置文件...?

回答

4

你忘了給你的輸入組件id。這就是<h:message>for屬性應指向的位置。

<h:inputText id="nameInput"> 

無關的具體問題,你的做法是笨拙和技術上的錯誤。按照規範,你應該拋出一個ValidatorException。因此,而不是

((UIInput) validate).setValid(false); 
context.addMessage(validate.getClientId(), msg); 

throw new ValidatorException(msg); 

那麼JSF會擔心設置組件爲無效,並添加消息上下文。


還有第二個問題,您是驗證本地值而不是提交的值。

通過

nameMatcher = textPattern.matcher(inputFromField); 
+0

我只是做了更換

nameMatcher = textPattern.matcher(getName()); 

你說什麼,但我沒有看到我的任何形式輸出advicing我,我進入了一個錯誤的輸入。這就是控制檯所說的:信息:警告:FacesMessage(s)已被排隊,但可能沒有被顯示。 sourceId = bRegForm:name [severity =(ERROR 2),summary =(/ WEB-INF/registerComposition.xhtml @ 14,132 validator =「#{registrationController.validateName}」:java.lang.NullPointerException),detail =(/ WEB -INF/registerComposition.xhtml @ 14,132 validator =「#{registrationController.validateName}」:java.lang.NullPointerException)] – sfrj 2011-03-04 16:01:26

+1

您仍**需要將'id =「name」'添加到輸入組件。然後可以找到'''。我甚至說,**「無關**的具體問題」:)順便說一句,你已經介紹了一個新的問題,NPE。 – BalusC 2011-03-04 16:04:04

+0

我更新了答案。將來,您應該提出一個新問題,而不是針對不同問題重複使用同一個問題。 – BalusC 2011-03-04 16:15:44