문제

다음과 같은 간단한 자바 콩이 있다고 말합니다.

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

JSR 303에는 EndDate 이전에 시작 해야하는 제약 조건을 검증하는 사용자 정의 유효성 검사기를 작성하는 메커니즘이 있습니까?

나에게는 공통 사용 사례가되는 것처럼 보이지만, 이런 종류의 다중 재산 관계 제약 조건의 예를 찾을 수는 없습니다.

도움이 되었습니까?

해결책

시도해 볼 몇 가지를 생각할 수 있습니다.

당신은 a를 만들 수 있습니다 Constraint 적절한 유효성 검사기를 사용하여 유형 자체의 대상을 사용합니다.

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

유형의 날짜 범위를 캡슐화하고 다음을 확인할 수 있습니다.

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

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

  // etc.

수표를 수행하는 간단한 속성을 추가 할 수 있습니다.

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

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

다른 팁

사용하는 경우 최대 절전 모드 유효성 검사기 버전 4.1 이상에서 사용할 수 있습니다 @ScriptAssert 이러한 종류의 제약을 표현하기 위해 스크립팅 또는 표현식 언어와 함께 제약. JavaScript를 사용하면 예제가 다음과 같습니다.

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

      private Date startDate;

      private Date endDate;

      //...
 } 

더 컴팩트 한 구문을 얻을 수 있습니다 사용자 정의 제약 조건 생성 선택한 스크립트 언어 :

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

    private Date startDate;

    private Date endDate;

    //...
}

답은 클래스 레벨 검증기입니다. 엔티티 클래스에서 배치 할 수있는 사용자 지정 제약 조건을 정의 할 수 있습니다. 유효성 검사 시간에 전체 인스턴스를 isvalid () 메소드로 전달됩니다. 그런 다음 두 날짜를 서로 비교할 수 있습니다. 최대 절전 모드 유효성 검사기도 참조하십시오 선적 서류 비치.

JSR 303 유효성 검사기에서 Bean에 액세스 할 수있는 방법이 없으므로 불가능합니다.

해결 방법은 자신의 것을 공급하는 것입니다 ConstraintValidatorContext 현재 검증중인 콩을 참조하여 확장하십시오. 그러나 각 공장을 수정/재정의 할 수 있는지 확실하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top