Witam. Napisałem walidator, który ma sprawdzać poprawność wprowadzanego numeru pesel. Sprawdzanie tego czy składa się on z 11 cyfr działa poprawnie, lecz chciałbym sprawić aby nie było możliwe dodanie takiego samego numeru pesel do bazy.
To mój walidator:
@ManagedBean
@RequestScoped
@FacesValidator("personalIdValidator")
public class PersonalIdValidator implements Validator {
@EJB
private UserDaoLocal userDao;
private User user = null;
@Override
public void validate(FacesContext context, UIComponent component,
Object value) throws ValidatorException {
boolean ok;
String personalId = value.toString();
String regex = "[0-9]{11}";
ok = Pattern.matches(regex, personalId);
System.out.println("Dao:" + userDao);
user = userDao.findPersonalIdExist(personalId);
if (!ok || (user != null)) {
throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Błędny pesel", "Błędny pesel"));
}
}
}
Nie wiedziałem jak przeszukać bazę w walidatorze. Jedyną radą wydało mi się zrobieni z walidatora beana poprzez dodanie
@ManagedBean
@RequestScoped
i wrzucenie mojego DAO:
@EJB
private UserDaoLocal userDao;
W celu przeszukania bazy wywołujemy metodę:
user = userDao.findPersonalIdExist(personalId);
jeśli zwróci null to nie ma takiego id w bazie.
Metoda:
@Override
public User findPersonalIdExist(String personalId) {
Query q = em.createQuery("SELECT u FROM User u WHERE u.personalId = :personalId");
q.setParameter("personalId", personalId);
user = (User) q.getSingleResult();
return user;
}
Raczej z metodą nie ma tutaj problemu. Bo wywala mi nulla w linijce
user = userDao.findPersonalIdExist(personalId);
ale sprawdziłem jak widać powyżej w walidatorze swojego Dao: System.out.println("Dao:" + userDao);
i jak wyszło faktycznie jest on nullem. Dlaczego?
Jeszcze mój walidator na stronie wygląda tak:
```java
<p:outputLabel for="personalId" value="#{msg.personalId}"></p:outputLabel>
<p:inputText id="personalId" value="#{userMB.user.personalId}" label="#{msg.personalId}" required="true">
<f:validator validatorId="personalIdValidator" />
<p:ajax update="msgPersonalId" event="keyup" />
</p:inputText>
<p:message for="personalId" id="msgPersonalId"/>
Czemu ten EJB jest nullem? Czy problemem jest to, że ten walidator jest ajaxowy i sprawdza dane od razu w momencie wprowadzania?