跨领域验证(JSR 303)问题

3

I have a simple bean, i.e.:

public class MyBean {

  private boolean selected;

  private String someString;

  ...
}

如果selected为真,我希望someString@NotNull等等。
有什么提示、链接可以实现这种行为吗?
谢谢 Jonny

1
可能是[使用Hibernate Validator(JSR 303)进行跨字段验证]的重复问题(https://dev59.com/rHI-5IYBdhLWcg3wMFW0) - Vineet Reynolds
2个回答

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的应用程序有趣。


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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接