Я пытаюсь подтвердить информацию, которую пользователь дает при регистрации.Одно из полей содержит почтовый адрес, который должен быть проверен путем поиска в базе данных, чтобы подтвердить, что он еще не существует.
Проблема в том, что если я введу существующий почтовый адрес, он выдаст исключение NonUniqueResultException, но также сохраняет нового пользователя с дубликатом почтового адреса в базе данных.Не понимайте этого, потому что после неудачной проверки проверка жизненного цикла JSF невозможна, она не должна переходить к фазе вызова приложения, верно?
Вот мой код:
- mailполе в регистре формуляр
<b:inputText id="mail" required="true"
requiredMessage="Bitte geben Sie Ihre E-Mail-Adresse an!"
label="E-Mail" placeholder="name@example.com" value="#{registrierenManagedBean.nutzer.mail}">
<f:validator validatorId="mailValidatorRegistrieren"/>
<b:messages for="mail"/>
</b:inputText>
мой пользовательский валидатор
@FacesValidator("mailValidatorRegistrieren")
public class MailValidatorRegistrieren implements Validator {
@EJB
private DAO dao;
private String mail;
private static final Pattern EMAIL_PATTERN =
Pattern.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", Pattern.CASE_INSENSITIVE);
@Override
public void validate(FacesContext facesContext, UIComponent uiComponent, Object o) throws ValidatorException {
mail = (String)o;
boolean matchesPattern = EMAIL_PATTERN.matcher(mail).find();
if(!matchesPattern)
{
throw new ValidatorException((new FacesMessage("Invalid mail")));
}
if(mail.isEmpty()) {
return;
} else if(validateNutzer(mail)){
throw new ValidatorException(new FacesMessage("mail alredy used"));
} else{
return;
}
}
private boolean validateNutzer(String mail) {
try {
Nutzer n = dao.findNutzerByMail(mail);
return n.getMail().equals(mail);
} catch (NullPointerException e) {
return false;
}
}
}
и метод "findNutzerByMail" из моего DAO
public Nutzer findNutzerByMail(String mail) {
try {
return em.createNamedQuery("findNutzerByMail", Nutzer.class)
.setParameter("mail", mail)
.getSingleResult();
} catch (NoResultException e) {
return null;
}
}