【问题标题】:How to use @Pattern on non-mandatory fields JSR 303如何在非必填字段 JSR 303 上使用 @Pattern
【发布时间】:2011-08-25 07:59:56
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java validation spring-mvc bean-validation


    【解决方案1】:

    添加空约束是最好的方法。在此约束中,您可以添加自己的 @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;
        }
    
    
    
    }
    

    希望这会有所帮助..

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 模式匹配和 null 都有效吗?我的意思是,这两个输入都是有效的空值(在我的情况下是空的)并且文本与正则表达式匹配。我会除了验证器之外仍然是验证失败,因为如果模式为空,则不会匹配该模式。
        • 如果值为null,则@Pattern不会被测试。仅测试 @NotNull(和特定于 Hibernate 的 @NotEmpty)。
        • 我完全按照上面提到的那样做,JSF 没有验证一个空字段。当使用 @Pattern 持久化实体时,我从 JPA 获得了 ConstraintViolationException。 JSF 和 JPA 中的验证有区别吗?
        猜你喜欢
        • 2016-11-10
        • 1970-01-01
        • 2011-10-23
        • 2010-12-30
        • 1970-01-01
        • 2019-07-11
        • 2012-04-05
        • 1970-01-01
        相关资源
        最近更新 更多