SpringMVCのリクエストパラメータに含まれた日付を受けとる方法
ログを日付でフィルタリングをする実装をしてて、サーバ側のControllerの引数にDate型を書いたら、素直には動いてくれなかった。
クライアント側のコードがこちら。
var params = 'fromTime=' + $('input[name=fromTime]').val() + '&toTime=' + $('input[name=toTime]').val(); $.getJSON('${pageContext.request.contextPath/json/log?' + params, function (json) { update(json); // 画面更新 });
サーバー側のControllerはこんな感じ。
@RequestMapping(value = "/json/log", method = RequestMethod.GET) @ResponseBody public List<Log> log(@RequestParam(required = false) Integer page, @RequestParam(required = false) Date fromTime, @RequestParam(required = false Date toTime) { return logService.query(page, fromTime, toTime); }
クライアントはリクエストを送信してるのに、Controllerが呼ばれてない。
ぐぐってみたら、PropertyEditerとか使えばできるらしい。
≫Spring MVCでリクエストパラメータを日付型に変換してControllerに渡す - Fight the Future
そんなのめんどくさいからやりたくない。
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); @RequestMapping(value = "/json/log", method = RequestMethod.GET) @ResponseBody public List<Log> log(@RequestParam(required = false) Integer page, @RequestParam(required = false) String fromTime, @RequestParam(required = false String toTime) { Date ft = null; try { ft = dateFormat.parse(fromTime); } catch (Exception e) {} Date tt = null; try { tt = dateFormat.parse(fromTime); } catch (Exception e) {} return logService.query(page, ft, tt); }
これで日付のフィルタリングが動くようになった。
が、FromとToで同じ日を指定するとまったくヒットしない。
ちょっと考えてみたら、FromとToの両方が午前0時だからヒットしてないんだって気付いた。
というわけで、時刻まで指定するようにコードを修正して、期待通りに動くようになった。
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS"); @RequestMapping(value = "/json/log", method = RequestMethod.GET) @ResponseBody public List<Log> log(@RequestParam(required = false) Integer page, @RequestParam(required = false) String fromTime, @RequestParam(required = false String toTime) { Date ft = null; try { ft = dateFormat.parse(fromTime + " 00:00:00.000"); } catch (Exception e) {} Date tt = null; try { tt = dateFormat.parse(fromTime + "23:59:59.999"); } catch (Exception e) {} return logService.query(page, ft, tt); }