Bean验证Java条件

时间:2013-10-17 18:56:45

标签: java jpa bean-validation

现在我有一个班级BaseSchedule它由4个班级(作曲家)使用。我想验证两个使用类而不是其他类。我对如何这样做感到有点困惑。

我的BaseSchedule如下所示:

@Embeddable
@DatesStartBeforeEnd(start = "startDateTime", end = "endDateTime")
public class BaseSchedule implements Serializable {

    private Date startDateTime;

    private Date endDateTime;
}

我想检查以确保在将数据持久保存到数据库时startDateTimeendDateTime不为空。通常我会为每个字段提供@NotNull

public class TimeSlot implements Scheduleable {
  @Embedded
  private BaseSchedule schedule;
}

但是......就我的TimeSlotTemplate而言,我不想要验证,因为我知道它会为空。

public class TimeSlotTemplate extends SchedulableClassTemplateEvent {
    @Embedded
    private BaseSchedule schedule;
}

2 个答案:

答案 0 :(得分:1)

如果您使用Hibernate Validator作为BV提供商,一种解决方案可能是使用自定义default group sequence provider

为了实现这一点,您的BaseSchedule对象必须知道"角色"它目前有,例如通过将带有SlotScheduleTemplateSchedule等值的枚举传递给其构造函数。根据角色,组序列提供程序可以确定要验证的序列,如果角色为@NotNull,则返回不包含TemplateSchedule约束的序列。

并非此方法要求您在JPA生命周期验证期间使用默认序列。

答案 1 :(得分:0)

我认为这可以使用@PrePersist Annotation完成。

@PrePersist
public void prePersist(){
 if(isPerformNullableCheck()){
        // check for null values and raise an error if invalid
 }
}
在TimeSlotTemplate中,您可以将performNullableCheck属性设置为false ...

另一种方法可能是在层次结构中添加一个类。 BaseSchedule包含所需的属性,例如ValidatedSchedule(扩展BaseSchedule)会覆盖它们并执行notnull检查。不知道这是否有效。这也许不是解决问题的最佳方案..?