2011-08-09 100 views
3

我有一個簡單的bean,即:跨字段驗證(JSR 303)的問題

public class MyBean { 

    private boolean selected; 

    private String someString; 

    ... 
} 

所以,如果selected是真的,我想someString@NotNull等。

任何提示,鏈接如何實現此行爲?

感謝 強尼

+1

[使用Hibernate Validator(JSR 303)進行交叉字段驗證的可能的重複](http://stackoverflow.com/questions/1972933/cross-field-validation-with-hibernate-validator-jsr-303) –

回答

2

你可以通過註釋MyBean與自定義驗證,例如這樣做:

@ValidMyBean 
public class MyBean { 

    private boolean selected; 

    private String someString; 

    ... 
} 

ValidMyBean:

@Target({ ElementType.FIELD }) 
@Retention(RetentionPolicy.RUNTIME) 
@Constraint(validatedBy = MyBeanValidator.class) 
public @interface ValidMyBean { 

    boolean allViolationMessages() default true; 

    Class<?>[] constraints() default {}; 

    Class<?>[] groups() default {}; 

    String message() default "{ValidMyBean.message}"; 

    Class<? extends Payload>[] payload() default {}; 
} 

MyBeanValidator:

public final class MyBeanValidator implements 
     ConstraintValidator<ValidMyBean, MyBean> { 

    @Override 
    public void initialize(
      @SuppressWarnings("unused") final ValidMyBean constraintAnnotation) { 
    } 

    @Override 
    public boolean isValid(final MyBean value, 
      final ConstraintValidatorContext context) { 

     boolean isValid = true; 
     //your validation here 

     return isValid; 
    } 
} 
+0

謝謝,這工作就像一個魅力! – user871611

3

如果您使用Spring Framework,那麼您可以使用Spring表達式語言(SpEL)。我已經寫了一個小型庫,它提供了基於SpEL的JSR-303驗證器,使得跨場驗證變得非常簡單。看看https://github.com/jirutka/validator-spring

而且有對你的情況下,例如:

@SpELAssert(value = "someString != null", applyIf = "selected", 
      message = "{validator.missing_some_string}") 
public class MyBean { 

    private boolean selected; 

    private String someString; 

    ... 
} 

其實這是太容易了。嘗試一些更有趣的事情,當密碼字段中的一個不爲空時,可能是密碼字段相等。

@SpELAssert(value = "password.equals(passwordVerify)", 
      applyIf = "password || passwordVerify", 
      message = "{validator.passwords_not_same}") 
public class User { 

    private String password; 
    private String passwordVerify; 
} 

而且你甚至可以在這些表達式中使用你自己的「輔助方法」!

與Hibernate Validator的@ScriptAssert註釋相比,這是純粹的Java解決方案,它沒有使用任何符合JSR-223的腳本語言,這可能有點問題。另一方面,這種解決方案僅適用於基於Spring的應用程序。

+0

這是美麗的,非常好的工作Jakub。 –