如何在非必填字段 JSR 303 上使用 @Pattern
Posted
技术标签:
【中文标题】如何在非必填字段 JSR 303 上使用 @Pattern【英文标题】:How to use @Pattern on non-mandatory fields JSR 303 【发布时间】:2011-08-25 07:59:56 【问题描述】:如何在非强制性表单字段上使用@Pattern
约束?
@Pattern(regexp="...")
private String something;
只要我提交表单,我就会收到预期的验证错误,但用户可能会将该字段留空,因为这不是必填字段。
PS:我可以编写自己的约束注释。但是,我只是问一种更简单的方法来组合注释或添加注释属性。 JSR303 实现是hibernate-validator。
【问题讨论】:
【参考方案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 中很容易通过 <context-param>
中的 web.xml
完成。但是,由于您使用的是 Spring MVC 而我没有这样做,所以我在这里搜索了一下,发现 this answer 可能有用。
【讨论】:
模式匹配和 null 都有效吗?我的意思是,这两个输入都是有效的空值(在我的情况下是空的)并且文本与正则表达式匹配。我会除了验证器之外仍然是验证失败,因为如果模式为空,则不会匹配该模式。 如果值为null
,则@Pattern
不会被测试。仅测试 @NotNull
(和特定于 Hibernate 的 @NotEmpty
)。
我完全按照上面提到的那样做,JSF 没有验证一个空字段。当使用 @Pattern 持久化实体时,我从 JPA 获得了 ConstraintViolationException。 JSF 和 JPA 中的验证有区别吗?以上是关于如何在非必填字段 JSR 303 上使用 @Pattern的主要内容,如果未能解决你的问题,请参考以下文章
如何使用嵌套的“类型”属性在 Mongoose 模式中定义非必填字段?
由于在非必填表单字段上应用了 CustomValidator,表单无效
使用 Hibernate Validator (JSR 303) 进行跨字段验证
prisma2:如何通过 prisma.user.findMany() 中的非必填字段进行过滤?