قيود التحقق من صحة جافا (JSR303) التي تنطوي على العلاقة بين العديد من خصائص الفاصوليا

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

سؤال

أقول أن لدي فول جافا البسيط التالي:

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

هل هناك آلية في JSR 303 لإنشاء مصدق مخصص يتحقق من صحة القيد الذي يجب أن يكون عليه بدء تشغيله؟

يبدو لي أن أكون حالة استخدام مشتركة، لكنني لا أستطيع أن أجد أي أمثلة على هذا النوع من قيود علاقات العقارات المتعددة.

هل كانت مفيدة؟

المحلول

أستطيع أن أفكر في بعض الأشياء التي يجب تجربتها.

يمكنك إنشاء Constraint مع هدف من النوع نفسه مع Validator مناسب:

@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;

    //...
}

الجواب هو التحقق من صحة المستوى. يمكنك تحديد القيود المخصصة التي يمكنك وضعها على فئة الكيان. في وقت التحقق من الصحة، حصلت على تمرير المثال بأكملها في الطريقة ISVALD (). يمكنك بعد ذلك مقارنة تواريخك ضد بعضهما البعض. انظر أيضا منصة السبات توثيق.

نظرا لعدم وجود طريقة للوصول إلى الفول في مدقق JSR 303، هذا غير ممكن.

سيكون الحل البديل لتزويد بنفسك ConstraintValidatorContext وتمديده مرجع إلى الفول الذي تتحقق منه حاليا. لكنني لست متأكدا مما إذا كان يمكنك تعديل / تجاوز المصنع المعني.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top