如何在非必填表单字段上使用@Pattern
约束?
@Pattern(regexp="...")
private String something;
当我提交表单时,我会得到预期的验证错误,但用户可能会留下该字段为空,因为这不是必填字段。
PS: 我可以编写自己的约束注释。然而,我只是想问一种更简单的方法,将注释组合或添加注释属性。JSR303实现是hibernate-validator。
如何在非必填表单字段上使用@Pattern
约束?
@Pattern(regexp="...")
private String something;
当我提交表单时,我会得到预期的验证错误,但用户可能会留下该字段为空,因为这不是必填字段。
PS: 我可以编写自己的约束注释。然而,我只是想问一种更简单的方法,将注释组合或添加注释属性。JSR303实现是hibernate-validator。
null
而不是空字符串即可。由于默认情况下,空的HTML输入字段会作为HTTP请求参数提交为空字符串,因此您需要让MVC框架将提交的空值解释为null
。在JSF中,通过在web.xml
中使用<context-param>
很容易实现。但是,由于您正在使用Spring MVC而我不知道如何操作,所以我在这里搜索并找到了这个答案,可能会有用。解决这个问题的另一种方法是在正则表达式中允许空字符串作为可替代的有效值(使用“|”符号)。
正如BalusC在JSF 2中所说,可以自动将空字符串转换为null。要使用的上下文参数是“javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL”,必须将其设置为“true”(请参见此答案)。
添加一个空约束是最好的方法。在这个约束中,您可以添加自己的@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;
}
}
null
,则不会测试@Pattern
。只有@NotNull
(以及Hibernate特定的@NotEmpty
)将被测试。 - BalusC