EJB w Walidatorze JSF

0

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?

1

Dzieje się tak bo: http://stackoverflow.com/questions/7572335/how-to-use-ejb-inject-and-or-autowired-in-facesvalidator
konkretnie FacesValidator nie jest instancjonowany przez kontener EJB toteż nie wstrzyknie ci zależności od twojego EJB.
Czytaj to: http://java.sg/jsf-2-0-custom-validator-calling-ejb-injected-bean/

1 użytkowników online, w tym zalogowanych: 0, gości: 1