交叉字段验证(JSR 303)问题

时间:2011-08-09 09:06:12

标签: java bean-validation

我有一个简单的bean,即:

public class MyBean {

  private boolean selected;

  private String someString;

  ...
}

因此,如果selected为真,我希望someString@NotNull等。

任何提示,链接如何实现此行为?

由于 强尼

2 个答案:

答案 0 :(得分:3)

如果您正在使用Spring Framework,那么您可以使用Spring Expression Language(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的应用程序。

答案 1 :(得分: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;
    }
}