Java Bean Validation (JSR303) las limitaciones que implican relación entre varias propiedades del bean

StackOverflow https://stackoverflow.com/questions/1700295

Pregunta

Decir que tengo el siguiente bean Java simple:

class MyBean {
   private Date startDate;
   private Date endDate;
   //setter, getters etc...
}

¿Hay un mecanismo en el JSR 303 para crear un validador personalizado que valida la restricción de que startDate debe ser antes endDate?

Me parece ser un caso de uso común, sin embargo, no puedo encontrar ningún ejemplo de este tipo de restricción múltiples relationsship propiedad.

¿Fue útil?

Solución

Puedo pensar en algunas cosas para probar.

Se puede crear un Constraint con un objetivo del tipo en sí con un validador adecuado:

@ValidateDateRange(start="startDate", end="endDate")
public class MyBean {

Se puede encapsular un intervalo de fechas en un tipo y validar que:

public class DateRange {    
  private long start;
  private long end;

  public void setStart(Date start) {
    this.start = start.getTime();
  }

  // etc.

Se podría añadir una propiedad simple que realiza la verificación:

public class MyBean {
  private Date startDate;
  private Date endDate;

  @AssertTrue public boolean isValidRange() {
    // TODO: null checks
    return endDate.compareTo(startDate) >= 0;
  }

Otros consejos

Si está utilizando Hibernate Validator en la versión 4.1 o posterior puede utilizar la @ScriptAssert restricción junto con un lenguaje de script o expresión para expresar este tipo de restricción. Uso de JavaScript tu ejemplo sería el siguiente:

 @ScriptAssert(lang = "javascript", script = "_this.startDate.before(_this.endDate)")
 public class CalendarEvent {

      private Date startDate;

      private Date endDate;

      //...
 } 

Usted puede obtener una sintaxis aún más compacto por crear una restricción personalizada para el lenguaje de secuencia de comandos de su elección:

@JexlAssert("_.startDate < _.endDate")
public class CalendarEvent {

    private Date startDate;

    private Date endDate;

    //...
}

La respuesta es un validador de nivel de clase. Se puede definir restricciones personalizadas que puede colocar en la clase de entidad. A la hora de validación te pasaste toda la instancia en el método isValid (). A continuación, puede comparar sus dos fechas uno contra el otro. Véase también la Hibernate Validator documentación .

Como no hay manera de acceder al frijol en un validador de JSR 303, esto no es posible.

Una solución sería la de proporcionar su propia ConstraintValidatorContext y extenderlo con una referencia al bean la que se está validando. Pero no estoy seguro de si se puede modificar / anular la fábrica respectiva.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top