交叉字段validation(JSR 303)问题
我有一个简单的bean,即:
public class MyBean { private boolean selected; private String someString; ... }
因此,如果selected
为true,我希望someString
为@NotNull
等。
任何提示,链接如何实现这种行为?
谢谢Jonny
您可以通过使用自定义validation器注释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 { @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; } }
如果您正在使用Spring Framework,那么您可以使用Spring Expression Language(SpEL)。 我编写了一个小型库,它提供了基于SpEL的JSR-303validation器,可以非常容易地进行跨场validation。 看看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的应用程序。
- 它如何在JSF2中使用beanvalidation消息和i18n?
- JPA – 找不到类型为enum的validation器
- 如何使用Spring MVC JSR-303 Validator将不同的模型类validation为一个表单
- 有没有办法从Bean Validation字段级ConstraintValidator中访问目标bean?
- JSR303复合注释
- 如何获取ConstraintValidatorContext?
- 使用Java EE 6 Beanvalidation
- Hibernate Validator方法或构造函数validation
- 如何在Spring Boot项目中禁用Hibernatevalidation