Tiene sentido para mí que tendría que ser llamado antes de pedir un objeto validate
si hasErrors
(o save
de objetos de dominio apropiadas, lo que exige validate
bajo las sábanas). Validar en este contexto significa "verificar si este objeto es válido e indicar cualquier error si no es así".
Alternativamente, la implementación GORM debería llamar al validate
cada vez que se realiza un cambio en un objeto, lo que para mí sería un comportamiento menos deseable, ya que podría implicar mucho trabajo frecuente e innecesario (algunas de esas restricciones podrían implica mucho trabajo).
El comienzo de la sección 7.2 indica bastante claramente "Para validar una clase de dominio puede llamar al método de validación en cualquier instancia". También establece que "dentro de Grails hay esencialmente 2 fases de validación, la primera fase es el enlace de datos que se produce cuando vincula los parámetros de solicitud a una instancia como ... En este punto, es posible que ya tenga errores en la propiedad de errores debido a tipo de conversión (como convertir cadenas en fechas). Puede verificarlas y obtener el valor de entrada original usando la API de errores. ... La segunda fase de validación ocurre cuando se llama a validar o guardar. Esto es cuando Grails validará el límite valores contradice las restricciones que definió ".
El documentation for hasErrors
también lo menciona. Puede acceder a esto buscando la llamada al método en el cuadro de navegación de la izquierda, cuando se encuentre en el documentation site. Siempre recomendaría buscar en estas y en las páginas más descriptivas de la guía del usuario, ya que a menudo ofrecen un poco más de detalle. Here's the page for the validate
method también.
Nunca he tenido un problema al llamar directamente al validate
; es muy claro para mí y puedo elegir el punto donde todo el trabajo está hecho y estoy listo para que la validación tenga lugar. No puedo ver una opción para cambiar este comportamiento en cualquier lugar, pero si quería llamar al validate
automáticamente o bajo ciertas condiciones, tal vez podría usar algo de magia de programación meta Groovy añadiendo invokeMethod
a la clase y hacer que llame al validate
antes de pasar ciertas llamadas en. Eche un vistazo here y here. (¡Aunque no estoy seguro de que lo recomiende! Y tenga en cuenta que su clase ahora dependería de su uso dentro del marco de validación GORM, ya que de lo contrario no existiría el método validate
).
Muchas gracias por su respuesta cuidadosa, lo entiendo ahora. –
Por cierto ... Peter Ledbrook (uno de los autores del excelente libro Grails in Action) ha escrito una gran serie de artículos sobre GORM Gotchas, que vale la pena leer para conocer algunos de los detalles de cómo todo esto funciona: [parte 1] (http://blog.springsource.com/2010/06/23/gorm-gotchas-part-1/), [parte 2] (http://blog.springsource.com/2010/ 07/02/gorm-gotchas-part-2 /) y [parte 3] (http://blog.springsource.com/2010/07/28/gorm-gotchas-part-3/). –