Validación
Existen principalmente dos formas de especificar la validación en nuestra acción. Anotando los parámetros de nuestra acción o anotando los campos de nuestra entidad.
Anotar los parámetros de la acción
}
1
2
3
public static void save(@Required String name) {
Anotar los campos de la entidad
}
1
2
3
4
5
6
7
8
@Entity
public class Tweet extends Model {
<span class="nd">@Required</span>
<span class="kd">public</span> <span class="n">String</span> <span class="n">msg</span><span class="o">;</span>
<span class="o">...</span>
En el caso de que estemos pasando un objeto entero mediante parámetro, podemos validarlo utilizando la anotación @Valid. Comprobará todos sus campos y las anotaciones que tiene.
}
1
2
3
public static void create(@Valid Tweet tweet) {
Es muy común el patrón de: Si la entidad está correcta, almacenala en base de datos, en caso contrario no hagas nada.
1
2
3
4
5
public static void create(@Valid Tweet tweet) {
if(!validation.hasErrors()){
tweet.save();
}
}
La simplificación de este método sería
1
2
3
public static void create(Tweet tweet){
tweet.validateAndSave();
}
Validaciones disponibles
Puedes consultar las validaciones incluidas por defecto en http://www.playframework.org/documentation/1.2.3/validation-builtin
Mostrando los errores de validación
Play trae una serie de tags que te permiten mostrar los errores de validación.
- #{error ‘fieldName’/} - Muestra el error para un campo en concreto
- #{errorClass /} - Equivalente a ${errors.forKey(‘name’) ? ‘hasError’ : ‘’}. Se suele utilizar para añadir una clase de css distinta y resaltar los errores.
- #{errors /} - Permite iterar en todos los errores
- #{ifError ‘user.name’}
- #{ifErrors}
Ejercicio
Añade validación al formulario que envía el tweet.
- Un tweet no puede estar vacío
- Un tweet no puede tener más de 140 caracteres
- Muestra los mensajes de error con el estilo adecuado de Twitter Bootstrap
Solución
apps/controllers/Timeline.java
}
1
2
3
4
5
6
7
8
9
10
11
public static void create(String tweet){
checkAuthenticity();
Tweet t = new Tweet(tweet, Security.userConnected());
t.validateAndSave();
<span class="k">if</span><span class="o">(</span><span class="n">validation</span><span class="o">.</span><span class="na">hasErrors</span><span class="o">()){</span>
<span class="n">validation</span><span class="o">.</span><span class="na">keep</span><span class="o">();</span>
<span class="o">}</span>
<span class="n">index</span><span class="o">();</span>
app/views/Timeline/index.html
1
2
3
4
5
6
7
#{ifErrors}
<div class=“alert-message error”>
#{errors}
<p>${error}</p>
#{/errors}
</div>
#{/ifErrors}