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

xyz*_*xyz 7 validation spring annotations

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

现场可以为空 它应该包含一个非空字符串

我知道注释@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 { };
}
Run Code Online (Sandbox Code Playgroud)

验证器类

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) {

    }
} 
Run Code Online (Sandbox Code Playgroud)

我也在我的网站上更新了它.

Ral*_*lph 5

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

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

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

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

所以你需要的是用@Size(min=1)而不是@NotEmpty.

BTW:不@NotEmpty只是的组合@NotNull@Size(min = 1)

*除了你自己实现它.