是否有任何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 { };
}
或者将@Pattern
注释与要求存在非空白字符的正则表达式一起使用(因为Pattern注释接受null,并且与模式不匹配)。
使用javax.validation.constraints.Size ,这在不创建自定义注释的情况下是可能的
// Null values are considered valid
@Size(min=1) String test;
然而,正如程序员所指出的,像" "
这样的空白字符串被认为是有效的,而@NotBlank
则不是这样。
哪里是一个不错的javax.validation.constraints.Pattern
注释。
您可以使用以下内容对字段进行注释:
@Pattern(regexp = "^(?!\s*$).+", message = "must not be blank")
这将检查字段是否与正则表达式匹配。正则表达式本身是东西,但不是空白(请参阅此处的详细信息)。它使用负面前瞻。
最好的方法是创建自己的约束验证器
//custom annotation
@Documented
@Constraint(validatedBy = CustomCheck.class)
@Target( { ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomConstarint {
String message() default "Invalid data";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
//validation logic goes here
public class CustomCheck implements
ConstraintValidator<CustomConstarint, String> {
@Override
public void initialize(CustomConstarint customConstarint) {
}
@Override
public boolean isValid(String field,
ConstraintValidatorContext cxt) {
//write your logic to validate the field
}
}
您尝试过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;
}