JPA validáció (1. rész - alapok)

Szinte minden komolyabb alkalmazás fejlesztése során sarkalatos pont, hogy miként kezeljük programunk funkcionalitásának szempontjából fontos adatainkat.


Felmerülhetnek itt olyan kérdések, hogy hol tároljuk őket (adatbázisban, vagy mondjuk valamilyen struktúrált fájl formátumban, például xml), hogyan tároljuk le őket (például adatbázis esetén JDBC, vagy valamilyen ORM keretrendszer), hogyan biztosítsuk a letárolt adataink védelmét és integritását, de téma lehet az archiválás, vagy akár az utólagos feldolgozás és még sok más egyéb.

Mi most közelebbről az adatok validációját fogjuk megvizsgálni. A ‘tiszta' adatok gyakorta előfeltételei a program helyes működésének, tehát nem árt már ‘születésük' pillanatától erőfeszítéseket tennünk ennek érdekében. A gondolat természetesen nem újszerű, mitöbb JSR szabvány is létezik erre, konkrétan JSR-303, mely a JavaEE 6-os verziójától kezdve már integráltan érkezik. Ahogy az lenni szokott, a szabványnak létezik referencia implementációja is, ez pedig a Hibernate Validator. Cikkünk során igyekszünk csak szabványos megoldásokat használni. A konkrét implementációk rendelkez(het)nek kiterjesztésekkel ehhez képest.

Keretrendszeri lehetőségek

Nem meglepő módon, ha mindössze a szabványos validációs lehetőségekkel szeretnénk élni, a dolog ujjgyakorlat szintjére egyszerűsödik.

@Entity
@Table(name="user")
public class User extends implements Serializable {

private static final long serialVersionUID = -353317929900858714L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;

@Column(name="username")
@NotNull
@Size(min = 4, max = 256)
private String username;

@Column(name="password")
@Size(min = 8, max = 32)
private String password;

@Transient
private String confirmPassword;

@Column(name="email")
@Size(min = 2, max = 128)
@Pattern(regexp="[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}")
protected String email

}


A példában használt JPA annotációkra most nem térünk ki külön, amúgy is viszonylag magától értetődőek. Mindössze a @Transient lehet érdekes, amivel is a confirmPassword mező szeretné elkerülni az ORM keretrendszer figyelmét.

Ami a validációs keretrendszer annotációit illeti (@NotNull, @Size, @Pattern, stb) ezeken kívül nincs is más dolgunk. Persze annotációnként külön attribútumokkal általában még szabályozhatunk egy-két dolgot, akit ez konkrétabban érdekel, például itt utána nézhet.
Ezek után vagy a validációs motor programozott megszólításakor (lásd alább), vagy pedig az entitásunk perzisztálásakor automatikusan megtörténhet a deklarált kritériumok ellenőrzése.

ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
Set constraintViolations = validator.validate(bean);