使用DAO的JSF验证不起作用

时间:2018-05-30 09:28:55

标签: validation jsf

我正在尝试验证用户在注册时提供的信息。其中一个字段包含mailadress,应通过查看数据库进行验证确认,但它还不存在。

问题是,如果我键入现有的mailadress,它将返回NonUniqueResultException,但也会将新用户与重复的mailadress存储在数据库中。不理解这一点,因为在验证失败后的JSF生命周期中,它不应该继续调用应用程序阶段,对吗?

这是我的代码:

  1. 寄存器表格中的邮件字段
  2. <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>

    1. 我的自定义验证器
    2. @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;
              }
          }
      }

      1. 和我的DAO中的“findNutzerByMail”方法
      2. public Nutzer findNutzerByMail(String mail) {
                try {
                    return em.createNamedQuery("findNutzerByMail", Nutzer.class)
                            .setParameter("mail", mail)
                            .getSingleResult();
                } catch (NoResultException e) {
                    return null;
                }
            }

0 个答案:

没有答案