¿Cuánta lógica debo manejar a través de JSR 303/Bean Validation?

Tengo una aplicación Play 2.0.1 y estoy aprendiendo el manejo de formularios a través de la carpeta de datos de primavera, como descrito en la documentación. Llegué al punto en que tengo un formulario, digamos que un usuario envía un mensaje a otro usuario, luciendo así:

public class MessageForm {

  @NotNull @NotEmpty
  public String message;

  @NotNull
  public User recipient;

  // i know, no sender
}

Mi carpeta personalizada se asegura de que el usuario, que está representado por su identificación en el formulario HTML, se serialice correctamente y se establezca de forma predeterminada en nulo cuando no exista dicho usuario.

Estoy pensando en escribir una validación adicional, es decir, para asegurarme de que el usuario que pasó a través del formulario sea amigo del usuario que intenta publicar el mensaje. Esto sería básicamente una especie de @FriendsWithCurrentUser-Anotación.

Sé cómo hacer exactamente eso, mi pregunta sería: ¿es una buena idea? Desde el punto de vista de un módulo, esta sería una restricción que está algo arraigada en el contexto web, por lo que no me gustaría ponerlo en mi paquete de modelos. Tengo la vaga sensación de que esto podría no ser para lo que está destinado el JSR, pero también creo que esto reduciría en gran medida la lógica en mis controladores y me permitiría reutilizar restricciones similares en los envíos de los usuarios.

preguntado el 12 de junio de 12 a las 22:06

1 Respuestas

Ese es el problema común. El otro caso similar son las validaciones que deben hablar con la base de datos.

Desde mi punto de vista, la pregunta es ¿con qué frecuencia vas a usar esa validación? Si es algo que se usará en 20 lugares, escribiría anotación + clase de validación, pero si esta validación se usa en uno o dos lugares, es mejor lanzar manualmente ConstraintViolationException. Entonces todavía estamos usando un mecanismo de validación común, pero no necesitamos escribir una clase de validador cuestionable. A veces, esto también es un problema de rendimiento: consultamos la base de datos solo por el bien de la validación y esa consulta a menudo se repite en la lógica empresarial.

La compensación es entre tener una validación bien separada del resto del código frente a un validador que combina varias capas de aplicación.

Por lo general, prefiero escribir una validación separada, ya que a menudo ocurre que la misma validación debe usarse en otro lugar. Sin un validador separado, a menudo duplico el código de validación existente, ya que siempre hay algo más importante que hacer que refactorizar la validación...

La idea de Bean Validation es tener una capa separada en la aplicación, que es responsable de la validación. Esa capa no debe mezclarse con Modelo, ya que un Modelo dado puede validarse de muchas maneras diferentes.

Podría haber un modelo y varios conjuntos de validadores: las anotaciones son solo la configuración. A veces, si Model se va a usar en varios productos, es incluso mejor renunciar a las anotaciones y usar una configuración basada en XML (es sorprendentemente fácil de comprender y usar).

Así que no ponga validadores en el paquete Modelo, cree un nuevo paquete para sus validadores, si quiere seguir ese camino.

Respondido el 12 de junio de 12 a las 23:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.