如何在@RequestParam中设置new Date()?代码默认值设置疑问
关于@RequestParam中设置new Date()的问题解答
首先直接给结论:你不能直接在@RequestParam的defaultValue属性里写new Date(),原因很简单——Java注解的属性值必须是编译期就能确定的常量表达式,而new Date()是运行时才会执行的动态代码,编译器根本不允许这么写,会直接报错。
那该怎么实现「如果请求没传这个日期参数,就默认用当前时间」的需求呢?给你两种可行的方案:
方案一:方法体内处理默认值(最推荐)
把@RequestParam的required设为false(这样没传参数时,Date类型的参数会是null),然后在方法里判断如果参数为null,就手动赋值为new Date()。代码示例如下:
@RequestMapping("/resa") public String reservation(Model model, @RequestParam(name = "date", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date date) throws ParseException { // 当请求没传date参数时,用当前时间作为默认值 if (date == null) { date = new Date(); } // 这里写你的业务逻辑 model.addAttribute("currentDate", date); return "reservation"; }
注意:如果要让Spring正确把请求中的字符串参数转成Date类型,记得加上
@DateTimeFormat注解指定日期格式,不然可能会出现类型转换异常。
方案二:用Java 8的Optional封装参数
如果你用的是Java 8及以上版本,也可以用Optional来包装Date参数,这样代码会更简洁:
@RequestMapping("/resa") public String reservation(Model model, @RequestParam(name = "date", required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Optional<Date> dateOpt) throws ParseException { Date date = dateOpt.orElseGet(Date::new); // 没传参数就调用new Date() // 业务逻辑 model.addAttribute("currentDate", date); return "reservation"; }
另外看你代码里的参数是int p(对应page参数),如果是页码这类基本类型的参数,同样不能用动态值当defaultValue——defaultValue只能是字符串形式的常量,比如defaultValue = "1"。如果想实现动态默认值,也要把参数改成包装类型(Integer),然后在方法体内处理:
@RequestMapping("/resa") public String reservation(Model model, @RequestParam(name = "page", required = false) Integer p) throws ParseException { int page = p != null ? p : 1; // 这里可以替换成你需要的动态默认逻辑 // 业务逻辑 return "reservation"; }
总结一下:注解的defaultValue只能用编译期常量,动态默认值的需求都要放到方法体内处理,这是Java注解机制的限制,没办法绕过~
内容的提问来源于stack exchange,提问作者Marian Mereuta
相关产品推荐
相关产品推荐

