和/或基于Spring注释的条件验证

时间:2012-02-13 11:00:08

标签: spring validation annotations

我正在使用基于Spring 3注释的验证。我想为String字段添加以下验证

  

字段可以为空 OR 它应包含非空字符串

我知道注释,例如@Null@NotEmpty,但我如何使用OR条件?


解决方案:

使用@Size(min=1)有帮助,但它不处理空格。因此添加了一个自定义注释NotBlankOrNull,它将允许null和非空字符串,它还会处理空格。非常感谢@Ralph 这是我的注释

@Documented
@Constraint(validatedBy = { NotBlankOrNullValidator.class })
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
public @interface NotBlankOrNull {
    String message() default "{org.hibernate.validator.constraints.NotBlankOrNull.message}";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };
}

验证员类

public class NotBlankOrNullValidator implements ConstraintValidator<NotBlankOrNull, String> {

    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
        if ( s == null ) {
            return true;
        }
        return s.trim().length() > 0;
    }

    @Override
    public void initialize(NotBlankOrNull constraint) {

    }
} 

我还在site上更新了它。

1 个答案:

答案 0 :(得分:5)

首先,它不是基于Spring注释的验证,它是JSR 303 Bean验证,例如通过Hibernate验证实现。这真的不是春天相关/

您无法以OR方式组合注释*。

但是对于非null约束有一个简单的解决方法,因为最基本的验证接受null作为有效输入(因此,如果你想要“正常”,你经常需要组合基本的vaidations和额外的@NotNull “行为,但不是你要求的。”

例如:   @javax.validation.constraints.Size接受null作为有效输入。

因此,您需要使用@Size(min=1)代替@NotEmpty

顺便说一句:不@NotEmpty只是@NotNull@Size(min = 1)

的组合

*,除非您自己实施。