【问题标题】:Java annotation for Null but neither Empty nor BlankNull 但既不是 Empty 也不是 Blank 的 Java 注释
【发布时间】:2015-09-16 21:47:21
【问题描述】:

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

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

【问题讨论】:

  • 不,但您可以自己编写一份。 :)
  • 这将是某种保证。这就是mutator methods 的用途。我认为这没有注释(至少在普通 Java 中没有)。
  • 任何@Pattern(regexp = xxx) ???

标签: java validation


【解决方案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;
    }
}

【讨论】:

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

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

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

【解决方案3】:

哪里有一个不错的javax.validation.constraints.Pattern 注释。

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

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

这会检查字段是否匹配正则表达式。正则表达式本身是 something but not blank (see details here)。它使用负前瞻。

【讨论】:

  • 此正则表达式有效,但我尝试使用它,SonarQube 将其标记为安全热点。
【解决方案4】:

在 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 注释与需要存在非空白字符的正则表达式一起使用(作为模式注释accepts nulls and does not match them against the pattern)。

【讨论】:

  • +1 表示@Pattern 的想法。这很棒,因为许多内置注释传递为 null,因此它们不会与 @NotNull
【解决方案5】:

你试过Hibernate-Validator吗?我想这就是你要找的。​​p>

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;

}

【讨论】:

  • 不,我不这么认为,我希望对我的单个变量进行所有这些验证
  • @NotBlank 验证您对单个变量的所有要求。如果您想要更少的验证,我只是添加了其他人。例如。如果您的变量可能包含空白字符,则使用@NotEmpty,或者如果它可能包含空字符串,则使用@NotNull
  • 我只是尝试解释与您的问题相关的细节。不是全部。怎么了?
  • 这些都不符合问题中的要求,即值不应为空,但仍可能为空。所有这些验证约束都在 null 时失败。
猜你喜欢
  • 2013-05-13
  • 2017-01-18
  • 2023-03-11
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多