【问题标题】:Cross field validation (JSR 303) problem跨字段验证 (JSR 303) 问题
【发布时间】:2011-10-23 01:17:10
【问题描述】:

我有一个简单的bean,即:

public class MyBean {

  private boolean selected;

  private String someString;

  ...
}

所以如果selected 为真,我希望someString@NotNull 等等。

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

谢谢 强尼

【问题讨论】:

标签: java bean-validation


【解决方案1】:

如果您使用的是 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 的应用程序感兴趣。

【讨论】:

    【解决方案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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-31
      • 2010-12-30
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 2015-01-10
      • 2016-02-25
      • 2011-10-30
      相关资源
      最近更新 更多