如何在非必填字段JSR 303上使用@Pattern

时间:2011-05-14 00:11:53

标签: java validation spring-mvc bean-validation

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

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

一旦我提交表单,我就会收到预期的验证错误,但是用户可能会将该字段留空,因为这不是必填字段。

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

3 个答案:

答案 0 :(得分:7)

只需使用null而不是空字符串设置它。由于空HTML输入字段默认提交为空字符串作为HTTP请求参数,因此您需要让MVC框架将空提交值解释为null。这可以通过<context-param>中的web.xml轻松完成。但是,既然你正在使用Spring MVC而我没有这样做,我在这里搜索了一下,发现this answer可能有用。

答案 1 :(得分:3)

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

正如BalusC在JSF 2中所说,可以将空字符串自动转换为null。要使用的上下文参数是“javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL”,必须将其设置为“true”(另请参阅此answer)。

答案 2 :(得分: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;
    }



}

希望这会有所帮助..