1. 커스텀 어노테이션 생성.
2. validate 부분 작성.
3. VO에 적용.
 
1.  커스텀 어노테이션 생성.
@Target({ ElementType.TYPE, ElementType.ANNOTATION_TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Constraint(validatedBy = FromDateBeforeOrSameAsToDateValidator.class) 
@Documented 
public @interface FromDateBeforeOrSameAsToDate { 
    String message() default "시작일은 종료일보다 클수 없습니다"; 
    Class[] groups() default {}; 
    Class[] payload() default {}; 
    String searchFromDt(); 
    String searchEndDt(); 
    @Target({ElementType.TYPE, ElementType.ANNOTATION_TYPE}) 
    @Retention(RetentionPolicy.RUNTIME) 
    @Documented 
    @interface List 
    { 
        FromDateBeforeOrSameAsToDate[] value(); 
    } 
}
 
2. validate 작성.
public class FromDateBeforeOrSameAsToDateValidator implements ConstraintValidator<FromDateBeforeOrSameAsToDate, Object> { 
    private String searchFromDt; 
    private String searchEndDt; 
    @Override 
    public void initialize(FromDateBeforeOrSameAsToDate constraintAnnotation) { 
        searchFromDt = constraintAnnotation.searchFromDt(); 
        searchEndDt = constraintAnnotation.searchEndDt(); 
    } 
    @Override 
    public boolean isValid(Object requestObject, ConstraintValidatorContext constraintValidatorContext) { 
        Field fromDateField = FieldUtils.getField(requestObject.getClass(), searchFromDt, true); 
        Field toDateField = FieldUtils.getField(requestObject.getClass(), searchEndDt, true); 
        String fromLocalDate = (String) ReflectionUtils.getField(fromDateField, requestObject); 
        String toLocalDate = (String) ReflectionUtils.getField(toDateField, requestObject); 
        SimpleDateFormat transFormat = new SimpleDateFormat("yyyyMMdd"); 
        transFormat.setLenient(false); //유효한 날짜인지 체크 예를들어 2019/01/32 이런거 체크
        Date from = new Date(); 
        Date to = new Date(); 
        if (fromLocalDate == null || toLocalDate == null) { 
            return true; 
        } 
        try { 
             from = transFormat.parse(fromLocalDate); 
             to = transFormat.parse(toLocalDate); 
            if(from.compareTo(to) > 0){ // Date 1 occurs after Date 2 
                return false; 
            } 
        } catch (ParseException e) { 
            constraintValidatorContext.buildConstraintViolationWithTemplate("유효하지 않은 날짜 입니다.") .addConstraintViolation(); 
            return false; 
        } 
        constraintValidatorContext.disableDefaultConstraintViolation(); 
        constraintValidatorContext.buildConstraintViolationWithTemplate( 
                "시작일은 종료일보다 클수 없습니다.") 
                .addConstraintViolation(); 
        return fromLocalDate.equals(toLocalDate) ||  (from.compareTo(to) < 0); 
    } 
}
 
3. VO에 적용.
@FromDateBeforeOrSameAsToDate.List({ @FromDateBeforeOrSameAsToDate(searchFromDt = "regStartDate", searchEndDt = "regEndDate" }) 
public class EmployeeContractDelivery extends BaseObject {
        /*등록시작일자*/ 
        private String regStartDate; 
        /*등록종료일자*/ 
        private String regEndDate;
 
        public String getRegStartDate() { 
            return regStartDate; 
        }  
        public void setRegStartDate(String regStartDate) { 
            this.regStartDate = regStartDate; 
        } 
        public String getRegEndDate() { 
            return regEndDate; 
        } 
        public void setRegEndDate(String regEndDate) { 
            this.regEndDate = regEndDate; 
        }
}