首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >自定义验证

自定义验证
EN

Stack Overflow用户
提问于 2014-12-16 21:42:06
回答 3查看 65关注 0票数 0

我希望有一个自定义注解来验证电子邮件在表单中是否是唯一的。Aldready成功地创建了一个"ValidEmail“注释。

代码语言:javascript
代码运行次数:0
运行
复制
@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = EmailValidatorImpl.class)
public @interface ValidEmail {
    String message() default "{error.validEmail}";
    String[] groups() default {};
}

执行类:

代码语言:javascript
代码运行次数:0
运行
复制
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“注释。

代码语言:javascript
代码运行次数:0
运行
复制
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),所以我真的不喜欢在初始化方法中直接创建用户服务层的实例。你建议怎么解决这个问题?注释可以引用实例吗?

代码语言:javascript
代码运行次数:0
运行
复制
@Override
public void initialize(UniqueEmail annotation) {
    this.userServices = annotation.getUserServices();
}

如有任何建议,将不胜感激。谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-16 21:49:22

通常,我不建议在您的验证器中使用您的服务(对于MVC和没有副作用)。既然您使用Spring,为什么不注入您的服务呢?

代码语言:javascript
代码运行次数:0
运行
复制
@Autowired
public void setUserService(final UserServices userServices) {
    this.userServices = userServices
}
票数 1
EN

Stack Overflow用户

发布于 2014-12-16 21:48:09

您应该直接注入userServices依赖项。根据项目的结构,这要么是自动创建的,要么是构造函数注入的,或者是setter注入的。

以另一种方式执行该操作是的更严格限制,因为注释要求它们中的所有设置都是编译时常量,因此无论如何只能在其中包含StringClass对象,并且必须通过反射实例化所关心的对象。用Spring来做这件事更有意义。

此外,您的实际验证方法是可疑的。我希望findByEmail应该通过电子邮件返回数据库中的用户,即boolean。以这种方式使用try...catch似乎不合适,而且效率很低,因为您的验证程序可能会经常被调用。

票数 1
EN

Stack Overflow用户

发布于 2014-12-16 21:48:30

你为什么不直接注射UserServices

代码语言:javascript
代码运行次数:0
运行
复制
@Autowired
private UserServices userServices;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27514451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档