2012-02-13 66 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