2012-02-13 68 views
7

我使用基於Spring 3註解的驗證。我想添加一個下面的驗證字符串字段和/或基於Spring註解的驗證條件

字段可以空OR它應該包含一個非空字符串

我知道註釋像@Null@NotEmpty但我怎麼可以同時使用OR條件?


解決方案:

使用@Size(min=1)幫助,但它不處理的空間。因此添加了一個自定義註釋NotBlankOrNull,這將允許null和非空字符串,它也照顧空格。非常感謝@Ralph。
這是我詮釋

@Documented 
@Constraint(validatedBy = { NotBlankOrNullValidator.class }) 
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
@Retention(RUNTIME) 
public @interface NotBlankOrNull { 
    String message() default "{org.hibernate.validator.constraints.NotBlankOrNull.message}"; 

    Class<?>[] groups() default { }; 

    Class<? extends Payload>[] payload() default { }; 
} 

Validator類

public class NotBlankOrNullValidator implements ConstraintValidator<NotBlankOrNull, String> { 

    public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) { 
     if (s == null) { 
      return true; 
     } 
     return s.trim().length() > 0; 
    } 

    @Override 
    public void initialize(NotBlankOrNull constraint) { 

    } 
} 

我也更新它在我的site

回答

5

首先,它不是基於Spring註釋的驗證,它是JSR 303 Bean驗證,例如通過Hibernate Validation實現。它實際上不是彈簧相關的/

您不能以OR方式*組合註釋。

但是,對於not null約束有一個簡單的解決方法,因爲最基本的驗證接受null作爲有效的輸入(因此,如果你想要一個有效的輸入,你通常需要結合基本vaidations和額外的@NotNull,正常「的行爲,但不是你要求的)。

例如: @javax.validation.constraints.Size接受null作爲有效輸入。

所以你需要在你的情況是使用@Size(min=1)而不是@NotEmpty

BTW:不@NotEmpty只是一個除了你通過你的自我實現它的@NotNull@Size(min = 1)

*組合。

+0

非常感謝四個建議並糾正了我。我試過'@Size(min = 1)',它適用於'null'和非空字符串。只是想知道如何處理,如果用戶進入空間? – xyz 2012-02-13 11:21:28

+0

@Ajinkya:看看NotBlank Annotation源代碼。它再次被NotNull註解。但它通過NotBlankValidator驗證(fortunaly NotBlankValidator返回true(有效)爲null)。所以你需要自己的Annotation,但可以重用Validator實現> @Constraint(validatedBy = {NotBlankValidator.class})@Target ... @Retention ... public @interface NotBlankOrNull' – Ralph 2012-02-13 15:10:19

+0

非常感謝:) – xyz 2012-02-13 18:47:46