javax.validation.constraints.Pattern注释的参数化错误消息?

时间:2014-09-03 18:49:48

标签: java validation

我有一个类型为String的字段的实体,我在其上定义了@Pattern注释,强制匹配给定正则表达式的字段内容。现在我想知道,是否可以参数化约束,例如在定义的验证错误消息中显示与正则表达式不匹配的第一个字符。

更糟糕的是,为注释违规显示的错误消息没有直接在注释中定义,而是在属性文件中定义,如下例所示:

示例类:

public class Address {
  @Pattern(regexp="[a-zA-Z]*", message="paremeterizedMessage")
  private String street;
}

示例属性文件:

parameterizedMessage = Invalid character {0}. Only characters a-z, A-Z allowed.

是否可以使用javax.validation执行此类操作?我假设@Pattern注释无法参数化错误消息。但也许可以使用参数化验证消息定义我自己的ConstraintValidator

1 个答案:

答案 0 :(得分:0)

考虑到某些验证注释(例如@Size(min=1,max=5))允许使用其注释参数(例如The String must have a length of {min} to {max} characters.)的参数化错误消息这一事实,我找到了一个参数化错误消息的解决方案,通常与占位符如{ {1}},{0},...:

定义自己的验证约束,例如:

{1}

在验证器类中,反射可用于扩展存储所有注释参数的地图(例如@Constraint(validatedBy=OnlyCharactersAllowedValidator.class) @Documented @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) public @interface OnlyCharactersAllowed { String message() default "parameterizedMessage"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } 的{​​{1}}和min),并且可以添加其他参数键max@Size等:

0

如果您的验证消息是在诸如。

之类的属性文件中定义的,那么此解决方案甚至可以工作
1