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

标签 spring validation annotations

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

Field can be Null OR it should contain a non empty 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 { };
}

验证器类

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 上更新了它.

最佳答案

首先,它不是基于 Spring 注解的验证,它是 JSR 303 Bean Validation,例如由 Hibernate Validation 实现。这确实与 spring 无关/

您不能以 OR 方式组合注释*。

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

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

因此,您的情况需要使用 @Size(min=1) 而不是 @NotEmpty

顺便说一句:Not @NotEmpty只是@NotNull@Size(min = 1)的组合

*除非你自己实现它。

关于spring - Spring 基于注释的验证中的和/或条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9259329/

相关文章:

java - 在本地创建 spring 和 nodejs 应用程序之间的 SSL 连接

java - Spring Rest Web 服务输入验证

javascript - 隐形验证码 : preventing image challenge before submiting form

swift - 将 Firebase 中的坐标表示为 Swift 注释

objective-c - MKMapView RegionDidChangeAnimated 由用户操作或程序调用

java - 使用 spring 注解在派生类中设置基类的属性

unit-testing - 用于测试的嵌入式 H2 数据库的 Spring 配置

java - 组织.hibernate.HibernateException : 'hibernate.dialect' must be set when no Connection available

java - 如何过滤 Collection 以获得两个不同类型的 List

ruby-on-rails - NoMethodError(未定义的方法 `validate' 为真 :TrueClass)