【发布时间】:2016-09-03 23:04:04
【问题描述】:
我想使用注释创建自定义电子邮件验证器。 This solution was useful while creating the validator. 这是注释:
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {CommonsEmailValidator.class})
@Documented
@ReportAsSingleViolation
public @interface ExEmailValidator {
String message() default " {org.hibernate.validator.constraints.Email.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface List {
ExEmailValidator[] value();
}
}
这是 CommonsEmailValidator 类:
public class CommonsEmailValidator implements ConstraintValidator<ExEmailValidator, String> {
private static final boolean ALLOW_LOCAL = false;
private EmailValidator realValidator = EmailValidator.getInstance(ALLOW_LOCAL);
@Override
public void initialize(ExEmailValidator email) {
// TODO Auto-generated method stub
}
@Override
public boolean isValid(String email, ConstraintValidatorContext constraintValidatorContext) {
if( email == null ) return true;
return realValidator.isValid(email);
}
}
我运行该项目,但是,当我在注册表单上单击提交时,虽然电子邮件格式无效,但出现以下异常:
请求处理失败;嵌套异常是 javax.validation.ConstraintViolationException:在组 [javax.validation.groups.Default, ]
的持续时间内,类 [...] 的验证失败异常与预期一样,但我不想显示 500 错误,而是希望看到一条错误消息来解释问题所在。 所以,我想我必须使用 ConstraintValidatorContext 来定义自定义错误消息。但是,我不知道该怎么做。 请问有什么想法吗?
【问题讨论】:
-
你的问题是?有一个例外,因为它是无效的,正如您所期望的,所以我看不出您遇到的问题。一件事是注释的
message值中有很多前导空格。 -
是的,异常是预期的,但我不想显示 500 错误,而是希望看到一条错误消息来解释问题所在。这不允许用户在输入格式正确的电子邮件之前单击提交
-
验证是在服务器上完成的,而不是在客户端上,所以你必须按下提交来触发验证。
-
啊,好吧。那么自定义错误消息呢?请检查我编辑的帖子。
-
假设您使用的是 Spring MVC,请将
@Valid添加到您要验证的方法参数中。
标签: java spring validation constraints