Play Framework 2 / Validaciones de objetos redundantes

Supongamos que un Carobjeto modelo (como case class), inmutable y creado usando un patrón de construcción. (Patrón de constructor de Joshua Bloch).

Su buildmétodo llama a un CarValidatorobjeto para permitir la creación o no del interesado Car. De lo contrario, arroja un IllegalStateExceptioncon campos inesperados precisados.

Por lo tanto, nadie podría crear un estado obsoleto o inválido Caren cualquier momento en tiempo de ejecución, ¡genial!

Supongamos ahora un formulario web para crear un Car. El controlador de Play contendría este mapeo de formulario:

val carForm = Form(               //this is a conceptual sample
    mapping(
      "brand" -> nonEmptyText,
      "description" -> nonEmptyText,
      "maxSpeed" -> number
      "complexElement" -> number.verifying(........) //redundant validation here
    )(Car.apply)(Car.unapply)
  )   

En este ejemplo, hay algunos campos básicos, pero imagina campos más complejos que exigen validaciones comerciales complejas como complexeElementaquí.

Realmente tengo la sensación de que fácilmente rompería el SECO (No te repitas).

De hecho, sea lo que sea lo que traiga la validación del formulario, esto ya lo proporcionará Carel validador de mi constructor, ya que la validación en el modelo es EL lugar de validación más importante y no debería depender de nada más.

Me imagino una solución con una Helperclase cerca de mi Controllertrato con el mismo objeto validador que usa mi constructor. Sin embargo, me obliga a obtener todos los métodos de validación publicpara poder ser llamado independientemente en cualquier paso de validación de mi formulario web (como en el fragmento de código anterior).

¿Cuál sería una buena práctica para mantener este principio de construcción mientras se evita romper el SECO?

Respuesta 1

Cuando intenté establecer el resultado de mi programa en textView en un cuadro de diálogo, la aplicación se cerró. Hice el cuadro de diálogo vinculando un xml que tiene una vista de texto y es esta vista de texto la que intenté ...

Este pequeño programa no supera el resultado esperado. ¡Eche un vistazo y vea si puede ayudar por favor! public static void main (String [] args) {Entrada del escáner = nuevo escáner (System.in); Cuerda ...

Necesito crear una aplicación con una sola ventana y sin ventanas emergentes. Todo funciona usando la misma ventana y solo cambiando el contenido. Voy a crear una aplicación usando swing. He leído ...

¿Cómo puedo obtener una cadena del cuerpo Flow.Publisher <Byte>? Solo quiero analizar la cadena desde Publisher.