Tu sei qui
Validazione in Parancoe.
Questo è il primo di una serie di post in cui parlerò di quello che sto facendo all'interno del progetto open source Parancoe.
Parancoe è un'idea che è nata all'interno del Jug Padova per la realizzazione di applicazioni web in Java, se siete interessati o volete partecipare, andate qua.
Uno dei problemi da risolvere è quello della gestione della validazione degli attributi di una classe (ad esempio presenza, lunghezza, ...).
Il problema della validazione
Andando ad analizzare più in dettaglio il problema, il meccanismo di validazione ha i seguenti requisiti:
- deve essere di facile utilizzo per lo sviluppatore: data la classe A non deve essere obbligatorio scrivere la classe A_val che ne faccia la validazione.
- deve comportare poca (o nulla) configurazione (sto parlando di file XML).
- dovrebbe essere facilmente integrabile con il modulo di gestione della vista realizzato con Spring MVC.
- deve essere (per il momento) lato server.
Validazione in Spring MVC.
Siccome uno dei requisiti è l'integrazione con la parte di presentazione, fatta con Spring MVC, chiarisco qui brevemente come funziona il meccanismo di validazione in questa libreria.
Supponiamo di avere una classe Person che contiene una serie di attributi, come il nome è il cognome e supponiamo di voler validare tale classe.
La classe sarà associata ad una form di inserimento e ad un controller che si occupa della
gestione della comunicazione tra model e view.
Spring MVC mette a disposizione l'interfaccia Validator, che fornisce un meccanismo di validazione.
Implementando tale interfaccia in una classe, ad esempio PersonValidator, possiamo in tale classe inserire le nostre regole di validazione.
Definendo tale classe nel file di configurazione della nostra web application possiamo associarla a Person ottenendo due cose:
- nel controller: viene iniettato il vettore di errori trovati dalla classe personValidator;
- nella view: nella jsp possiamo presentare gli errori tramite il tag: <form:errors />
Riassumendo, i passi da compiere sono:
- definire una classe che implementa Validator nella quale fare la validazione;
- definire nel file <nomecontroller>-servlet.xml il bean che rappresenta la classe definita in 1
id="personValidator"
class="org.parancoe.basicWebApp.po.PersonValidator"/> - nel file di configurazione di 2 associare la classe di validazione alla classe validata:
name="/people/edit.form"
id="peopleEditController"
class="org.parancoe.basicWebApp.controllers.PeopleEditController"
parent="abstractController">name="commandClass"
value="org.parancoe.basicWebApp.po.Person"/>name="commandName"
value="person"/>name="formView"
value="people/edit"/>name="successView"
value="redirect:list.html"/>ref="personValidator"/>
Questi passi vanno compiuti per ogni classe che deve essere validata.
Springmodules Validation
La soluzione al problema che sto analizzando prevede l'uso della libreria Springmodules.
La libreria Springmodules, mette a disposizione una serie di moduli a corredo del framework Spring.
Uno di questi è spring-modules-validation. Tale modulo fornisce un meccanismo di validazione che sfrutta le annotation e consente di dover scrivere pochissimo codice di configurazione.
Considerando la classe Person, possiamo definire la validazione direttamente sui field della stessa:
import org.springmodules.validation.bean.conf.
loader.annotation.handler.Length;
import org.springmodules.validation.bean.conf.
loader.annotation.handler.NotBlank;
public class Person {
@NotBlank
@Length(min=2,max=10)
private String firstName;
@NotBlank
@Length(min=2,max=20)
private String lastName;
@DateInThePast
private Date birthDate;
}
Le tre annotazioni definite permettono di controllare che:
- Il field non sia blank (@NotBlank)
- La lunghezza del field sia compresa tra due valori (@Length)
- La data inserita sia antecedente alla data di sistema (@DateInThePast)
Non è stato dunque necessario definire una specifica classe di validazione, la classe che compie la validazione, cioè quella che si andrà a leggere le annotazioni presenti in Person, si chiama BeanValidator.
Per configurarla dovremo fare due cose:
- Definire il bean in <nomecontroller>-servlet.xml:
id="validator"
>name="configurationLoader"
ref="configurationLoader"/>id="configurationLoader"
class="AnnotationlBeanValidationConfigurationLoader" /> - Associare il bean alla classe Person:
name="/people/edit.form"
id="peopleEditController"
parent="abstractController">name="validator"
ref="beanValidator"/>
BeanValidator implementa l'interfaccia Validator di Spring, quindi si integra perfettamente con il meccanismo di segnalazione degli errori di Spring MVC.
Inoltre definisce già una serie di regole di validazioni e permette di crearne di custom.
Inoltre permette di usare i resource bundle tramite alcune convenzioni sui nomi, ad esempio nel caso di Person il resource bundle inglese sarà:
Person.firstName[not.blank]=First Name is required
Person.lastName[not.blank]=Last Name is required
Alla regola NotBlank viene assegnato di default l'id not.blank.
Per particolareggiare il messaggio per i campi, li si qualifica con il nome della classe seguito dal nome del campo.
Per una trattazione più estesa delle proprietà di BeanValidator, rimando alla documentazione ufficiale.
- Blog di gtrev
Commenti
Mi pare che la validazione
???????
De cossa che xeo drio
De cossa che xeo drio parlare!
Voialtri ed il vostro Java....
Ma se' proprio bravi pero'!
mah ...java è alla portata
Secondo me la conoscenza di
La laurea in ingegneria è
La laurea in ingegneria è sprecata/inadeguata per il mercato italiano dell'informatica.
Non ti serve a gran chè la teoria dell'NP-completezza, mentre sarebbe stato più utile un corso di ingegneria del software e uno avanzato di basi di dati.
Grande Andrea ti bacio!!!!
Quoto e rilancio con un
Quoto e rilancio con un corso di automazione industriale serio... NON volevo fare il programmatore... Eppure e' una percentuale rilevantissima dela mia gioranta lavorativa...
In realtà la validazione
In realtà la validazione viene messa nella stessa classe dalla quale verrà gestita la persistenza: la classe Person su cui viene fatta la validazione è la stessa in cui viene dichiarata la persistenza (@javax.persistence.Entity())
Si', ma poi il binding lo
In teoria, per come è stato
>scrivere un solo bean con
>scrivere un solo bean con criteri di validazione e persistenza annidati...
Volevo dire annotati.
Domande sulla la soluzione
>2) la configurazone al
>2) la configurazone al punto 2 dipende dall'implementazione di Person in qualche forma? potremmo pensare di autogenerarla?
Si dobbiamo fare una configurazione per ogni bean, sarebbe una bella cosa riuscire ad evitare questa configurazione, magari adottando una naming convention.
Stiamo attenti con le
In questi giorni sono stato
In questi giorni sono stato davvero infognato, non sono riuscito a seguire il thread. Comunque:
mariano: per il punto 1) sì, la configurazione è comune quindi la sipotrebbe piazzare su parancoeBase.xml
enrico: la configurazione con naming convention che suggerivi al punto 2) la si può discutere. Però la mia conoscenza di spring e AOP è abbastanza scarsa ancora...
Ma tosatti, non ste'
Ma tosatti, non ste' drogarve... Non capisco molto di quello che scrivete, il javanese e' proprio complesso..... Almeno per me che non conosco un'ostia di Java.
Aggiungi un commento