【发布时间】:2016-10-25 21:10:34
【问题描述】:
我正在尝试实现类似 DateRange 验证器的东西来验证,如果开始日期早于结束日期。我已经为验证、验证器类等定义了注释。不幸的是,当我尝试访问或设置验证对象(通过 UI)中的某些内容时,不会调用验证。我究竟做错了什么 ?我定义了以下类:
TimePeriod.java
@Constraint(validatedBy = DateRangeValidator.class)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface TimePeriod {
String message() default "something";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
DateRangeValidator.java
public class DateRangeValidator implements ConstraintValidator<TimePeriod, DateRange>{
TimePeriod constraintAnnotation;
@Override
public void initialize(TimePeriod constraintAnnotation) {
this.constraintAnnotation = constraintAnnotation;
}
@Override
public boolean isValid(DateRange value, ConstraintValidatorContext context) {
throw new RuntimeException("Some exception");
}
}
DateRange.java
public class DateRange {
private Date startDate;
private Date endDate;
public DateRange(Date start, Date end){
this.startDate = start;
this.endDate = end;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
}
我使用 Primefaces 日历元素来选择开始和结束日期。这个片段是:
<p:calendar id="startdateWizard"
value="#{DRBean.dateRange.startDate}"
showButtonPanel="true"
required="true"
>
DRBean.java
@Named
@ViewScoped
public class PFSBean implements Serializable {
@TimePeriod
private DateRange dateRange = new DateRange(new Date(), new Date()) ;
public DateRange getDateRange() {
return dateRange;
}
public void setDateRange(DateRange dateRange) {
this.dateRange = dateRange;
}
}
可能是因为没有直接设置 dateRange 对象 - 只设置了其中一个字段。如果是这样,如何改变它以达到预期的效果(在 DateRange 对象上验证以确保开始日期始终在结束日期之前)
【问题讨论】:
标签: java primefaces jsf-2 bean-validation