Java Bean Validation (JSR303) Einschränkungen die Beziehung zwischen mehreren Bean-Eigenschaften

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

Frage

Sagen, ich habe den folgenden einfachen Java Bean:

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

Gibt es einen Mechanismus in JSR 303 einen benutzerdefinierten Validator zu erstellen, die die Einschränkung bestätigt, die vor dem startdate endDate sein muss?

Es scheint mir ein häufiger Anwendungsfall zu sein, aber ich kann keine Beispiele für diese Art von Multi-Eigenschaften relationsship Einschränkung finden.

War es hilfreich?

Lösung

Ich kann ein paar Dinge denken zu versuchen.

Sie könnten eine Constraint mit einem Ziel von der Art selbst mit einem geeigneten Prüfer erstellen:

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

Sie können einen Datumsbereich in einer Art einzukapseln und validieren, dass:

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

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

  // etc.

Sie können eine einfache Eigenschaft hinzufügen, die die Prüfung durchgeführt:

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

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

Andere Tipps

Wenn Sie mit Hibernate Validator in Version 4.1 oder höher können Sie die Verwendung @ScriptAssert constraint zusammen mit eine Skriptsprache oder Expressions diese Art von Einschränkung zu exprimieren. aussehen würde JavaScript Ihr Beispiel mit wie folgt aus:

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

      private Date startDate;

      private Date endDate;

      //...
 } 

Sie können eine noch kompaktere Syntax erhalten, indem für die Skriptsprache Ihrer Wahl> eine benutzerdefinierte Einschränkung zu erstellen:

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

    private Date startDate;

    private Date endDate;

    //...
}

Da es keine Möglichkeit gibt, die Bohne in einem JSR 303 Validator zuzugreifen, ist dies nicht möglich.

Eine Abhilfe wäre eine eigene ConstraintValidatorContext liefern und sie mit einem Verweis auf die Bohne erweitern Sie derzeit zu validieren. Aber ich bin nicht sicher, ob Sie können das jeweilige Werk ändern / außer Kraft setzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top