2011-05-14 16 views
10

如何在非强制表单字段上使用@Pattern约束?如何在非必需字段上使用@Pattern JSR 303

@Pattern(regexp="...") 
private String something; 

尽快提交我的形式,我得到验证错误预期,但用户可以保留该字段为空,因为这不是一个强制性的领域。

PS:我可以写我自己的约束注释。不过,我只是问一个更简单的方法来结合注释或添加注释属性。 JSR303的实现是hibernate-validator。

回答

6

只需将其设置为null而不是空字符串。由于空HTML输入字段默认作为HTTP请求参数作为空字符串提交,因此您需要让MVC框架将空提交的值解释为null。这在JSF很容易通过在web.xml完成。但是,由于您使用的是Spring MVC,我不这样做,所以我在这里搜索了一下,发现可能有用的this answer

+0

并且会是有效的两种模式匹配和空?我的意思是,这两个输入是有效的null(在我的情况下是空的)和文本匹配正则表达式。我会除了验证程序仍然是一个验证失败,因为模式将不匹配,如果它为空。 – 2011-05-14 00:37:41

+1

如果该值为null,则不会测试“@ Pattern”。只有'@NotNull'(和Hibernate特有的'@NotEmpty')才会被测试。 – BalusC 2011-05-14 00:39:16

+0

真棒,谢谢! – 2011-05-14 00:41:20

3

解决此问题的另一种方法是允许空字符串作为正则表达式中的替代有效值(使用“|”)。

由于BalusC在JSF 2中表示可以自动将空字符串转换为空值。要使用的上下文参数是“javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL”,它必须设置为“true”(另请参阅此answer)。

0

添加空约束是最好的方法。在此约束中,您可以添加自己的@Pattern作为构成约束。

@Target({ANNOTATION_TYPE, FIELD}) 
@Retention(RUNTIME) 
@Documented 
**@Pattern(regexp="...")** 
@Constraint(validatedBy = EmptyValueConstraintValidator.class) 
public @interface EmptyValueConstraint { 
    String message() default "{defaultMessage}"; 

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

    Class<? extends Payload>[] payload() default {}; 
    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER }) 
    @Retention(RUNTIME) 
    @Documented 
    @interface List { 
     EmptyValueConstraint[] value(); 
    } 
} 

public class EmptyValueConstraintValidator implements  
ConstraintValidator<EmptyValueConstraint, Object>{ 

    @Override 
    public void initialize(EmptyValueConstraint constraintAnnotation) { 

    } 

    @Override 
    public boolean isValid(Object value, ConstraintValidatorContext context) { 

     return true; 
    } 



} 

希望这有助于..