Null 的 Java 注释,但既不为空也不为空

2022-08-31 22:29:17

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

String test;
test = null; //valid
test = ""; //invalid
test = " "; //invalid
test = "Some values"; //valid

答案 1

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

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

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

然后实际的验证器: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) {
        return value == null || value.trim().length() > 0;
    }
}

答案 2

在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 { };
}

或者将批注与要求存在非空格字符的正则表达式一起使用(因为模式批注接受 null 并且不将它们与模式匹配)。@Pattern


推荐