簡體   English   中英

Null 但既不是 Empty 也不是 Blank 的 Java 注釋

[英]Java annotation for Null but neither Empty nor Blank

是否有任何 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 注釋接受空值並且不將它們與模式匹配)。

一個不錯的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
    }
}

通過使用javax.validation.constraints.Size可以在不創建自定義注釋的情況下實現這一點

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

你試過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;

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM