【发布时间】:2011-10-23 01:17:10
【问题描述】:
我有一个简单的bean,即:
public class MyBean {
private boolean selected;
private String someString;
...
}
所以如果selected 为真,我希望someString 为@NotNull 等等。
任何提示,链接如何实现这种行为?
谢谢 强尼
【问题讨论】:
标签: java bean-validation
我有一个简单的bean,即:
public class MyBean {
private boolean selected;
private String someString;
...
}
所以如果selected 为真,我希望someString 为@NotNull 等等。
任何提示,链接如何实现这种行为?
谢谢 强尼
【问题讨论】:
标签: java bean-validation
如果您使用的是 Spring 框架,那么您可以使用 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 的应用程序感兴趣。
【讨论】:
您可以通过使用自定义验证器注释 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;
}
}
【讨论】: