我的方法涉及使用自定义QueryStringBindable
。这样,我将路由参数表示为:
GET /birthdays/ controllers.Birthdays.getBirthdays(period: util.Period)
Period的代码如下所示。
public class Period implements QueryStringBindable<Period> {
public static final String PATTERN = "dd.MM.yyyy";
public Date start;
public Date end;
@Override
public F.Option<Period> bind(String key, Map<String, String[]> data) {
SimpleDateFormat sdf = new SimpleDateFormat(PATTERN);
try {
start = data.containsKey("startDate")?sdf.parse(data.get("startDate") [0]):null;
end = data.containsKey("endDate")?sdf.parse(data.get("endDate")[0]):null;
} catch (ParseException ignored) {
return F.Option.None();
}
return F.Option.Some(this);
}
@Override
public String unbind(String key) {
SimpleDateFormat sdf = new SimpleDateFormat(PATTERN);
return "startDate=" + sdf.format(start) + "&" + "endDate=" + sdf.format(end);
}
@Override
public String javascriptUnbind() {
return null;
}
public void applyDateFilter(ExpressionList el) {
if (this.start != null)
el.ge("eventDate", this.start);
if (this.end != null)
el.le("eventDate", new DateTime(this.end.getTime()).plusDays(1).toDate());
}
}
applyDateFilter
如果要将日期过滤应用于查询,这只是我在控制器中使用的一种便捷方法。显然,您可以在此处使用其他日期默认值,或者在方法中使用除null以外的其他默认值作为开始日期和结束日期bind
。
GET /birthday controllers.Application.birthday(from: Option[String] ?= None, to: Option[String] ?= None)