sobota, 24 stycznia 2009

Hibernate Validator + DataSource

Witam, dziś będzie o dostępie do dany z bazy, w hibernate validatorach. Przed przeczytaniem polecam zajrzeć na jeden z poprzednich postów, link. Pomysł, aby tym się zająć zrodził się podczas tworzenia formularza rejestracyjnego w moim projekcie. Uznałem, że fajnie byłoby, gdyby automatycznie po wpisaniu jakiegoś loginu, validator sprawdzał czy takowy istnieje już w naszej bazie i informował nas o tym.
Musimy zacząć od zmodyfikowania pliku persistance.xml, dodamy nowe property, dzięki któremy będziemy mogli pobrać obiekt typu EntityManagerFactory z pomocą JNDI. Ten zaś z kolei da nam dostęp do EntityManagera. Tak więc dodajemy wpis:

...
<properties>
...
<property name="jboss.entity.manager.factory.jndi.name" value="java:/myEntityManagerFactory"/>
</properties>
</persistence-unit>

Tworzymy teraz nowy validator:

@Documented
@Target(FIELD)
@Retention(RUNTIME)
@ValidatorClass(UsernameValidator.class)
public @interface Username {
String message() default "Podany login juz istnieje";
}

oraz

public class UsernameValidator implements Validator<Username>, Serializable
{
private static final long serialVersionUID = 1L;
EntityManager entityManager;

public void initialize(Username parameters)
{
}

public boolean isValid(Object value)
{
Context ctx = null;
String login = (String) value;
try
{
ctx = new InitialContext();
} catch (NamingException e)
{
e.printStackTrace();
}
EntityManagerFactory entityManagerFactory = null;
try
{
entityManagerFactory = (EntityManagerFactory) ctx.lookup("java:/myEntityManagerFactory");
} catch (NamingException e)
{
e.printStackTrace();
}
entityManager = entityManagerFactory.createEntityManager();

Query q = entityManager.createQuery("FROM Osoba WHERE login = '" + login + "'");
try
{
q.getSingleResult();
return false;
} catch (final NoResultException e)
{
return true;
}
}
}

Jak widzimy używając JNDI pobieramy EntityManagerFactory. Z pomocą entityManagera tworzymy zapytanie, a w bloku try catch, próbujemy uzyskać wynik tego zapytania, jeżeli metoda wyrzuci wyjątek znaczy to, że podany login nie istnieje w bazie. Zakładam, że loginy przechoowywane sa w tabeli Osoba w kolumnie login. Aby skorzystać z naszego validatora wystarczy nad odpowiednim polem dać adnotacje @Username.

3 komentarze:

  1. Wpisalem na googlach "hibernate validator query" i zgadnijcie co mi jako jeden z pierwszych wynikow zlapalo;)

    OdpowiedzUsuń
  2. Po wpisaniu tego już jesteśmy na 1. i 2. miejscu oO

    OdpowiedzUsuń
  3. Nasz plan zawładnięcia światem jak narazie się sprawdza! <tu wstaw śmiech szaleńca>

    OdpowiedzUsuń