在Spring MVC应用程序上,我开发了一个自定义JSR 303约束,如下所示:
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {})
@Pattern(regexp = EmailWithTld.PATTERN, flags = Pattern.Flag.CASE_INSENSITIVE)
public @interface EmailWithTld {
static final String PATTERN = "(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])";
String message() default "{springtest.constraints.EmailWithTld.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
问题是消息值被忽略,验证错误上显示的消息是来自@Pattern的消息(“必须匹配”(?:[a-z0-9!#$%&amp; ... ...“)
我希望它能从消息变量中返回我的消息。
我可以获得自定义消息的一种方法是将上述@Pattern替换为
@Pattern(message="{springtest.constraints.EmailWithTld.message}", regexp = EmailWithTld.PATTERN, flags = Pattern.Flag.CASE_INSENSITIVE)
如果我这样做,只要我使用资源包进行设置,就会显示正确的消息。如果通过注释用法设置,则不起作用。例如:
@Pattern(message="Testing 1 2 3}"
这样做的正确方法是什么?
答案 0 :(得分:1)
花了整整3个小时后,我通过查看Hibernate Validator源找到了答案,实际上非常简单......
将@ReportAsSingleViolation注释添加到类中。
这有效:
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {})
@ReportAsSingleViolation
@Pattern(regexp = EmailWithTld.PATTERN, flags = Pattern.Flag.CASE_INSENSITIVE)
public @interface EmailWithTld {
static final String PATTERN = "(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])";
String message() default "{springtest.constraints.EmailWithTld.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}