我希望有一个自定义注解来验证电子邮件在表单中是否是唯一的。Aldready成功地创建了一个"ValidEmail“注释。
@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = EmailValidatorImpl.class)
public @interface ValidEmail {
String message() default "{error.validEmail}";
String[] groups() default {};
}
执行类:
public class EmailValidatorImpl implements ConstraintValidator<ValidEmail, String> {
private static String EMAIL_PATTERN = "^[\\w\\.-]+@([\\w\\-]+\\.)+[A-Z]{2,4}$";
private Pattern pattern;
private Matcher matcher;
@Override
public void initialize(ValidEmail annotation) {
pattern = Pattern.compile(EMAIL_PATTERN, Pattern.CASE_INSENSITIVE);
}
@Override
public boolean isValid(String email, ConstraintValidatorContext context) {
return isValidEmail(email);
}
private boolean isValidEmail(String email) {
CharSequence emailstr = email;
matcher = pattern.matcher(emailstr);
return matcher.matches();
}
}
现在我想构建一个"uniqueEmail“注释。
public class UniqueEmailValidatorImpl implements ConstraintValidator<UniqueEmail, String> {
private UserServices userServices;
@Override
public void initialize(UniqueEmail annotation) {
this.userServices = annotation.getUserServices();
}
@Override
public boolean isValid(String email, ConstraintValidatorContext context) {
return isUniqueEmail(email);
}
private boolean isUniqueEmail(String email) {
try {
userServices.findByEmail(email);
} catch (UserDoesNotExistException e) {
return true;
}
return false;
}
}
因为我遵循IoC (使用Spring),所以我真的不喜欢在初始化方法中直接创建用户服务层的实例。你建议怎么解决这个问题?注释可以引用实例吗?
@Override
public void initialize(UniqueEmail annotation) {
this.userServices = annotation.getUserServices();
}
如有任何建议,将不胜感激。谢谢!
发布于 2014-12-16 13:49:22
通常,我不建议在您的验证器中使用您的服务(对于MVC和没有副作用)。既然您使用Spring,为什么不注入您的服务呢?
@Autowired
public void setUserService(final UserServices userServices) {
this.userServices = userServices
}
发布于 2014-12-16 13:48:09
您应该直接注入userServices
依赖项。根据项目的结构,这要么是自动创建的,要么是构造函数注入的,或者是setter注入的。
以另一种方式执行该操作是的更严格限制,因为注释要求它们中的所有设置都是编译时常量,因此无论如何只能在其中包含String
和Class
对象,并且必须通过反射实例化所关心的对象。用Spring来做这件事更有意义。
此外,您的实际验证方法是可疑的。我希望findByEmail
应该通过电子邮件返回数据库中的用户,即boolean
。以这种方式使用try...catch
似乎不合适,而且效率很低,因为您的验证程序可能会经常被调用。
发布于 2014-12-16 13:48:30
你为什么不直接注射UserServices
@Autowired
private UserServices userServices;
https://stackoverflow.com/questions/27514451
复制相似问题