我有一個簡單的bean,即:跨字段驗證(JSR 303)的問題
public class MyBean {
private boolean selected;
private String someString;
...
}
所以,如果selected
是真的,我想someString
是@NotNull
等。
任何提示,鏈接如何實現此行爲?
感謝 強尼
我有一個簡單的bean,即:跨字段驗證(JSR 303)的問題
public class MyBean {
private boolean selected;
private String someString;
...
}
所以,如果selected
是真的,我想someString
是@NotNull
等。
任何提示,鏈接如何實現此行爲?
感謝 強尼
你可以通過註釋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;
}
}
謝謝,這工作就像一個魅力! – user871611
如果您使用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的應用程序。
這是美麗的,非常好的工作Jakub。 –
[使用Hibernate Validator(JSR 303)進行交叉字段驗證的可能的重複](http://stackoverflow.com/questions/1972933/cross-field-validation-with-hibernate-validator-jsr-303) –