Null的Java注释,但既不是Empty也不是Blank

Yas*_*nan 18 java validation

是否有任何java注释可以像下面的示例一样进行验证?

String test;
test = null; //valid
test = ""; //invalid
test = " "; //invalid
test = "Some values"; //valid
Run Code Online (Sandbox Code Playgroud)

提前致谢

Jul*_*les 13

在javax.validation或Hibernate Validator中都没有这样的注释.有一个请求要向Hibernate Validator添加一个,但由于可以相对容易地编写自己的"不会修复"而被关闭.建议的解决方案是使用您自己的注释类型,如下所示:

@ConstraintComposition(OR)
@Null
@NotBlank
@ReportAsSingleViolation
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Constraint(validatedBy = { })
public @interface NullOrNotBlank {
    String message() default "{org.hibernate.validator.constraints.NullOrNotBlank.message}";
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default { };
}
Run Code Online (Sandbox Code Playgroud)

或者使用@Pattern带有正则表达式的注释,该表达式需要存在非空白字符(因为Pattern注释接受空值并且与模式不匹配).

  • +1 为`@Pattern` 想法。这很棒,因为许多内置注解都为 null 传递,这样它们就不会与 `@NotNull` 冲突 (2认同)

veg*_*4me 11

您需要创建自定义注释: @NullOrNotBlank

首先创建自定义注释: NullOrNotBlank.java

@Target( {ElementType.FIELD})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = NullOrNotBlankValidator.class)
public @interface NullOrNotBlank {
    String message() default "{javax.validation.constraints.Pattern.message}";
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default {};
}
Run Code Online (Sandbox Code Playgroud)

那么实际的验证器: NullOrNotBlankValidator.java

public class NullOrNotBlankValidator implements ConstraintValidator<NullOrNotBlank, String> {

    public void initialize(NullOrNotBlank parameters) {
        // Nothing to do here
    }

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

        boolean isAllWhitespace = s.matches("^\\s*$");
        return !isAllWhitespace;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 只需快速验证一行:`return str == null || str.trim().length()> 0;` (4认同)
  • @JeffersonLima 我不知道为什么我的代码如此冗长(我什至不喜欢正则表达式)。你的一个班轮是正确的。 (2认同)
  • 很好的解决方案,我将 isValid 检查替换为:`return value == null || !value.isBlank();` 因为我使用的是 Java 11。 (2认同)

Phi*_*hil 9

通过使用javax.validation.constraints.Size无需创建自定义注释即可实现此目的

// Null values are considered valid
@Size(min=1) String test;
Run Code Online (Sandbox Code Playgroud)

然而,正如程序员指出的那样,诸如 之类的空白字符串" "被认为是有效的,但@NotBlank.

  • 但它会破坏长度为 1 的空白字符串,如“_”(其中 _ 表示空格) (2认同)

Vla*_*iev 7

哪里有好的javax.validation.constraints.Pattern注释。

您可以使用以下方式注释该字段:

@Pattern(regexp = "^(?!\\s*$).+", message = "must not be blank")
Run Code Online (Sandbox Code Playgroud)

这检查字段是否与正则表达式匹配。正则表达式本身是一些东西,但不是空白请参阅此处的详细信息)。它使用负前瞻。


bhd*_*drk -7

您尝试过Hibernate-Validator吗?我想这就是你正在寻找的。

import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.NotEmpty;

public class MyModel  {

    @NotNull
    private String  str1;

    @NotEmpty
    private String  str2;

    @NotBlank
    private String  str3;

}
Run Code Online (Sandbox Code Playgroud)

  • 这些都不符合问题中的要求,即该值不应为空,但仍可能为空。所有这些验证约束在 null 时都会失败。 (3认同)