poniedziałek, 19 stycznia 2009

Co nieco o Hibernate Validator

Witam, dziś parę słów na temat walidacji, a dokładniej walidacji przy użyciu Hibernate Validator. Walidacja jest niezwykle przydatną funkcją podczas tworzenia wszelkiego rodzaju formularzy, możemy kontrolować to, co użytkownik może wprowadzić. Jeśli chodzi o walidatory JSF to dobry tutorial znajduje się tutaj. My jednak będziemy zajmować się narzędzie od Hibernate'a. Stronę projektu znajdziecie tutaj, zaś tutaj dokumentacje. Jeśli chodzi o jakieś dodatkowe JARy to w JBossie nie martwimy się o nie, zaś w Geronimo możliwe, że trzeba je będzie ściągnąć ze stronki Hibernate. W poprzednim poście napisałem nieco o RichFaces, więc teraz użyjemy go tworząc bardzo prosty formularz.

Jeśli chodzi o plik web.xml to nie zmienił się on od pooprzeniego razu.

Przejdźmy do zdefiniowania mbeana:

package com.blogspot.javazpiwnicy.mbeans;

import java.util.Date;

import org.hibernate.validator.Email;
import org.hibernate.validator.Length;
import org.hibernate.validator.NotEmpty;
import org.hibernate.validator.Past;
import org.hibernate.validator.Pattern;

import com.blogspot.javazpiwnicy.validator.Urodziny;

public class Osoba {
@NotEmpty(message = "Pole nie moze byc puste")
@Length(min = 2, max=15, message = "Minimalna dlugosc to 2, maksymalna 15")
private String login;

@NotEmpty(message = "Pole nie moze byc puste")
@Email(message = "To nie jest adres email")
private String email;

@Pattern(regex = "[0-9]{2}( |-)?[0-9]{3}", message = "Niepoprawny kod pocztowy")
private String kodPocztowy;

@Past(message = "Data nie jest z przeszlosci")
@Urodziny
private Date urodziny;

public String getLogin() {
return login;
}

public void setLogin(String login) {
this.login = login;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

public String getKodPocztowy() {
return kodPocztowy;
}

public void setKodPocztowy(String kodPocztowy) {
this.kodPocztowy = kodPocztowy;
}

public Date getUrodziny() {
return urodziny;
}

public void setUrodziny(Date urodziny) {
this.urodziny = urodziny;
}

public String dodaj() {
return "success";
}
}

Widzimy tutaj nad poszczególnymi polami Osoby różne adnotacje. Ich opis można znaleźć w dokumentacji. Do wyświetlania informacji służy "message", bez tego użyte zostaną standardowe informacje o błędzie. Oczywiście można te informacje pobierać z plików properties wystarczy wpisać "message={naszKluczWPliku}". Adnotacja Urodziny to nasz własny walidator sprawdzający czy osoba ma 18 lat.
Przejdźmy teraz do stworzenia własnego walidatora. Najpierw tworzymy deskryptor(adnotacja):

package com.blogspot.javazpiwnicy.validator;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import org.hibernate.validator.ValidatorClass;

@Documented
@Target(FIELD)
@Retention(RUNTIME)
@ValidatorClass(UrodzinyValidator.class)
public @interface Urodziny {
String message() default "Nie masz 18 lat";
}

A następnie plik walidatora:

package com.blogspot.javazpiwnicy.validator;

import java.util.Calendar;
import java.util.Date;
import org.hibernate.validator.Validator;

public class UrodzinyValidator implements Validator<Urodziny>{

public void initialize(Urodziny parameters) {
}

public boolean isValid(Object value){
Calendar dataUrodzin = Calendar.getInstance();
dataUrodzin.setTime((Date)value);
Calendar kiedys = Calendar.getInstance();
kiedys.add(Calendar.YEAR, -18);

if(dataUrodzin.before(new GregorianCalendar(kiedys.get(Calendar.YEAR),
kiedys.get(Calendar.MONTH), kiedys.get(Calendar.DAY_OF_MONTH))))
return true;
return false;
}
}
Dziękuje przy okazji Szymonowi za wskazówkę dotyczącą Calendar'a.
Tak więc zostaje nam jeszcze napisanie formularza:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<%@ taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@ taglib uri="http://richfaces.org/rich" prefix="rich"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>javazpiwnicy.blogspot.com</title>
</head>
<body>
<f:view>
<center><rich:panel header="Formularzyk" style="width: 400px">
<a4j:form>
<h:panelGrid columns="3">
<h:outputText value="Login" />
<h:inputText id="login" value="#{osoba.login}">
<rich:ajaxValidator event="onblur" />
</h:inputText>
<rich:message for="login"/>

<h:outputText value="Email" />
<h:inputText id="poczta" value="#{osoba.email}">
<rich:ajaxValidator event="onblur" />
</h:inputText>
<rich:message for="poczta"/>

<h:outputText value="Kod pocztowy" />
<h:inputText id="kod" value="#{osoba.kodPocztowy}">
<rich:ajaxValidator event="onblur" />
</h:inputText>
<rich:message for="kod"/>

<h:outputText value="Data urodzin" />
<rich:calendar id="dataUrodzenia" value="#{osoba.urodziny}">
<rich:ajaxValidator event="onclick" />
</rich:calendar>
<rich:message for="dataUrodzenia" />

<h:outputText value="" />
<a4j:commandButton value="Dodaj" action="#{osoba.dodaj}" />
</h:panelGrid>
</a4j:form>
</rich:panel></center>
</f:view>
</body>
</html>

I to byłoby na tyle. Po wpisaniu błędnych danych w formularzu powinna pojawić się stosowna informacja.

4 komentarze:

  1. Przy walidatorach bardzo pomocna jest adnotacja @Assert np.

    @AssertTrue protected boolean isImieValid;

    dzieki temu mozemy kontrolowac renderowanie wiadomosci w formularzach i nie mamy pustych miejsc na stronie;)

    OdpowiedzUsuń
  2. Fajne omowienie Hibernate Validator, bardzo przydatne dla poczatkujacych w Hibernate..i najwazniejsze: bardzo jasny i przejrzysty przyklad. Pozdrawiam i zycze dalszego rozwoju bloga w tym kierunku :)

    OdpowiedzUsuń
  3. Ten komentarz został usunięty przez autora.

    OdpowiedzUsuń