空但既不为空也不为空的Java注解

zed5wv10  于 2023-03-21  发布在  Java
关注(0)|答案(6)|浏览(169)

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

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

mitkmikd1#

您需要创建自定义注解:@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;
    }
}
nhhxz33t

nhhxz33t2#

javax.validation或Hibernate Validator中都没有这样的注解。有一个request to add one to 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注解accepts nulls and does not match them against the pattern)。

djmepvbi

djmepvbi3#

这里有一个漂亮的javax.validation.constraints.Pattern注解。
可以使用以下内容注解字段:

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

检查字段是否匹配regex。regex本身是但不是空的(详见此处)。它使用负向前看。

0vvn1miw

0vvn1miw4#

通过使用javax.validation.constraints.Size,无需创建自定义注解即可实现这一点

// Null values are considered valid
@Size(min=1) String test;

然而,正如theprogrammer所指出的,像" "这样的空白字符串被认为是有效的,而@NotBlank的情况并非如此。

wmvff8tz

wmvff8tz5#

最好的方法是创建自己的约束验证器,

//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
    }
}
dsekswqp

dsekswqp6#

你试过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;

}

相关问题