我需要在使用网络服务创建帐户时验证电子邮件和密码。我正在使用Spring REST控制器并计划使用@Email(hibernate验证器)注释进行电子邮件ID验证。对于密码验证,我必须通过实现Validator接口来编写自定义验证器。
@XmlRootElement
public class Account implements Serializable {
@Email(message =AccountErrorCodes.ACCOUNT_EMAIL_VALIDATION)
private String emailId;
private String password;
用于密码编写自己的验证器
@Autowired
private PasswordValidator passwordValidator;
@InitBinder
private void initBinder(WebDataBinder binder) {
binder.setValidator(passwordValidator);
}
看起来两者并不存在。当我尝试验证EmailId时,弹簧调用passwordValidator但无法验证电子邮件。我预计由于错误的电子邮件ID导致失败。当我禁用自定义验证器时,我收到了所需的错误消息。
看起来我错过了什么。我需要做些什么才能让它发挥作用吗?或者它不受支持?如果不支持我可以直接从spring自定义验证器调用Hibernate验证器,以避免编写我自己的电子邮件验证吗?
答案 0 :(得分:1)
不要在控制器中注入自定义验证器,而是为其创建一个特殊的@Password
注释,并将其用作验证器。从控制器中删除任何约束逻辑,并在DTO类上完成所有操作。像这样:
@Target({ METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = PasswordValidator.class)
public @interface Password {
String message() default "{Invalid password}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
您将找到大量使用您自己的验证器的自定义注释教程。希望有所帮助。
答案 1 :(得分:0)
是的。
您可以为任何类型制作自己的自定义注释。 例如:
@Phone
@NotEmpty
private String phone;
现在制作一个java文件:
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.RetentionPolicy;
import javax.validation.Constraint;
import javax.validation.Payload;
@Documented
@Constraint(validatedBy = PhoneValidator.class)
@Target( { ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface Phone {
String message() default "{Phone}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
提供验证措施的课程:
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class PhoneValidator implements ConstraintValidator<Phone, String> {
@Override
public void initialize(Phone paramA) {
// TODO Auto-generated method stub
}
@Override
public boolean isValid(String phoneNo, ConstraintValidatorContext ctx) {
// TODO Auto-generated method stub
if(phoneNo == null) {
return false;
}
//Validate phone numbers of format "1234567890"
if (phoneNo.matches("\\d{10}")) return true;
//validating phone number with -, . or spaces
else if(phoneNo.matches("\\d{3}[-\\.\\s]\\d{3}[-\\.\\s]\\d{4}")) return true;
//validating phone number with extension length from 3 to 5
else if(phoneNo.matches("\\d{3}-\\d{3}-\\d{4}\\s(x|(ext))\\d{3,5}")) return true;
//validating phone number where area code is in braces ()
else if(phoneNo.matches("\\(\\d{3}\\)-\\d{3}-\\d{4}")) return true;
//return false if nothing matches the input
else return false;
}
}
现在:
包括:
#Custom validation annotation
Phone=Invalid format, valid formats are 1234567890, 123-456-7890 x1234
通过这种方式,您将成功获得自定义验证器。
将捕获错误并从属性文件中获取消息。
希望这有帮助。