Null 的 Java 注释,但既不为空也不为空
2022-08-31 22:29:17
是否有任何Java注释可以像下面的示例一样进行验证?
String test;
test = null; //valid
test = ""; //invalid
test = " "; //invalid
test = "Some values"; //valid
是否有任何Java注释可以像下面的示例一样进行验证?
String test;
test = null; //valid
test = ""; //invalid
test = " "; //invalid
test = "Some values"; //valid
您需要创建自定义注释:@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;
}
}
在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