2009-06-24 27 views
0

有沒有從驗證器中訪問其他表單字段的正確方法? 有另一種解決方案比:訪問來自驗證器內部的請求參數

context.getViewRoot().findComponent("formid:exampleField:example")?

f.e我想驗證一個自定義的驗證器內的城市場和檢查,如果國家是美國。

+0

您是否找到您的問題的答案? – 2009-08-07 00:41:50

回答

1

重讀你的問題,我將它解釋爲這樣:

「你想編寫一個檢查,如果一個城市字段存在,國家字段等於‘美國’自定義驗證「

所以,我想看看下面的方式去了解這一點:

首先創建一個驗證器接口:

@Documented 
@ValidatorClass(value=CountryEqualsUSValidator.class) 
@Target(ElementType.TYPE) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface CountryEqualsUS { 

    String message() default "The country should be US for the city provided"; 

} 

然後創建AV alidator類:

public class CountryEqualsUSValidator implements Validator<CountryEqualsUS> { 

    public void initialize(CountryEqualsUS arg0) { 
    } 

    public boolean isValid(Object value) { 

     if(value != null && value instanceof YourBeanClass) { 

      YourBeanClass yourBeanClass = (YourBeanClass) value; 

      if(/*some test logic here*/) { 
       return true; 
      else { 
       return false; 
      } 

     } 

     return false; 

    } 

} 

然後在類要驗證:

@CountryEqualsUS 
public class YourBeanClass { 

    ... 

} 

然後,最後,在你的控制器/動作類,當表單提交,城市是一個值你想檢查的國家,添加此方法,並將其稱爲:

public boolean doValidation(YourBeanClass yourBeanClass) { 

    ClassValidator requestValidator = new ClassValidator(yourBeanClass.getClass()); 
    InvalidValue[] validationMessages = requestValidator.getInvalidValues(yourBeanClass); 

    if (validationMessages != null && validationMessages.length > 0) { 

     for (int i = 0; i < validationMessages.length; i++) { 

      //Add a validation message to be displayed to the user 

     } 

     return false; 

    } 
     return true; 
} 
相關問題