validar validaciones validacion mvc internacionalización ejemplo configurar con campos bindingresult arquitectura java jsf bean-validation

java - mvc - validaciones spring boot



JSF: JSR 303 Validación de frijoles: ¿por qué en getter y no en setter? (3)

Anotar getters no significa que la validación se realiza cuando se invoca un getter. Solo se usa para identificar la propiedad a la que se aplicará una restricción.

La gran ventaja de poner restricciones en los captadores (generalmente públicos) en lugar de los campos (generalmente privados) es que las restricciones forman parte de la API pública del tipo de esa manera. Incluso se agregarán al JavaDoc generado. Un usuario de un tipo sabe de qué manera se aplican restricciones sin tener en cuenta su implementación interna.

Otra ventaja de anotar getters es que las restricciones se pueden poner en métodos en clases base o interfaces y también se aplican a cualquier subtipo / implementación.

No entiendo por qué JSR 303 (validación de bean) es para los métodos getter y no setter? ¿No es más lógico ponerlo bajo el método setter ya que ese es el punto de entrada a un campo y la validación debe ser verificada antes de eso?


Considera este código:

public class BeanValidation { private int nameSetCount = 0; private int nameGetCount = 0; private String name; public String getName() { this.nameGetCount++; return name; } public void setName(String name) { this.nameSetCount++; this.name = name; } }

Ponga una anotación sobre private String name;

La anotación identifica el campo fácilmente con solo mirar el campo .

Ponga una anotación sobre public String getName()

La anotación identifica el campo fácilmente con solo mirar el campo devuelto .

Ponga anotación sobre public void setName(String name)

La anotación no puede identificar el campo que mira el campo modificado porque puede haber más de uno.


Es una muy buena pregunta y algo a lo que nunca le presté atención. Pero creo que sé la respuesta (y también por qué nunca me hice esta pregunta).

Si está viendo esto, desde el punto de vista de que la anotación define dónde ocurrirá la validación, entonces ponerlo en getter no tiene sentido. (¿por qué no validar mientras se almacena el valor en sí mismo ...). Pero así no es como funciona ...

El programador necesita contarle al marco de validación qué propiedades necesitan ser validadas. Entonces puedes poner la anotación directamente en el atributo (que yo prefiero) o puedes ponerlo en el getter. Ambos significan operación de lectura. El Framework necesita leer todos los atributos de su clase, que deberán ser validados. Entonces, en este caso, poner setter no tiene ningún sentido ... La clave para entender es la perspectiva ...

Espero que tenga sentido.