在ConstraintValidator对象内使用JpaRepository

时间:2019-01-28 16:15:36

标签: spring-boot jpa bean-validation

我有一种Controler方法,该方法从用户可以使用的表单中接收电子邮件地址,例如,如果用户丢失了密码或在注册后未收到验证电子邮件,则可以使用。

因此,当用户从控制器方法提交表单时,请检查电子邮件是否有效。我还创建了一个自定义验证器,以检查数据库中是否存在电子邮件。因此,验证器执行选择,如果查询什么都不返回,则返回false。我认为这样做很方便,但这是个好主意吗?常见的做法?

@PostMapping({"/password/forgot"})
public ModelAndView passwordForgot(@ModelAttribute("email")
                                       @Valid 
                                       @RequestBody EmailDto email,
                                       BindingResult result,
                                       WebRequest request,
                                       Errors errors) {

    if (!result.hasErrors()) {
      //send the email
    }

    return new ModelAndView("passwordForgot", "email", email);
}

通过电子邮件发送DTO

@NoArgsConstructor
@Getter
@Setter
public class EmailDto {

    @NotNull
    @NotEmpty
    @Email
    @EmailExist
    private String email;
}

通过电子邮件发送验证器

@Target({TYPE, FIELD, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = EmailExistValidator.class)
@Documented
public @interface EmailExist {
    String message() default "{email.not.exist}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}

public class EmailExistValidator implements ConstraintValidator<EmailExist, String> {

    @Autowired
    private AuthPersonRepository personRepository;

    @Override
    public void initialize(EmailExist constraintAnnotation) { }

    @Override
    public boolean isValid(String email, ConstraintValidatorContext context){

        AuthPerson person = personRepository.findByEmail(email);

        return person != null;
    }
}

0 个答案:

没有答案