如何在JSR 303中在非强制字段上使用@Pattern

13

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

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

当我提交表单时,我会得到预期的验证错误,但用户可能会留下该字段为空,因为这不是必填字段。

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

3个回答

7
只需将其设置为null而不是空字符串即可。由于默认情况下,空的HTML输入字段会作为HTTP请求参数提交为空字符串,因此您需要让MVC框架将提交的空值解释为null。在JSF中,通过在web.xml中使用<context-param>很容易实现。但是,由于您正在使用Spring MVC而我不知道如何操作,所以我在这里搜索并找到了这个答案,可能会有用。

它是否同时适用于模式匹配和空值?我的意思是,两个输入都是有效的空值(在我的情况下是空的)和与正则表达式匹配的文本。我希望验证器仍然会出现验证失败,因为如果为空,则无法匹配模式。 - Erhan Bagdemir
1
如果值为null,则不会测试@Pattern。只有@NotNull(以及Hibernate特定的@NotEmpty)将被测试。 - BalusC
我按照上述方法进行了操作,但JSF没有验证空字段。当使用@Pattern持久化实体时,我从JPA得到了ConstraintViolationException异常。JSF和JPA的验证有区别吗? - Dan

3

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

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


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;
    }



}

希望这可以帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接