Spring MVC传递Date参数到Controller出现类型转换异常如何解决
问题根因
- 日期格式不匹配:前端
<input type="date">控件默认提交的日期格式为yyyy-MM-dd,但Controller中@DateTimeFormat配置的是dd/MM/yyyy,格式对不上导致转换失败 - 类型不支持:Spring的
@DateTimeFormat注解默认只提供字符串转java.util.Date的转换策略,你Controller参数如果直接声明为java.sql.Date,就会触发找不到转换策略的异常 - DAO层SQL参数缺失:你现有EmpDao的
JdbcTemplate.query调用中,SQL有两个?占位符,但没有传入对应的start、end参数,就算日期转换成功也会报SQL参数错误
修正方案
第一步:修改EmpController代码
import org.springframework.format.annotation.DateTimeFormat; import java.util.Date; // 导入java.util.Date而非java.sql.Date @Controller public class EmpController { @Autowired EmpDao dao; @GetMapping("/viewemp") public String viewemp(@RequestParam(value="start") @DateTimeFormat(pattern = "yyyy-MM-dd") Date start, @RequestParam(value="end") @DateTimeFormat(pattern = "yyyy-MM-dd") Date end, Model m){ // 如果你DAO层方法参数还是用java.sql.Date,加一步转换即可 java.sql.Date sqlStart = new java.sql.Date(start.getTime()); java.sql.Date sqlEnd = new java.sql.Date(end.getTime()); List<Event> list=dao.getEmployees(sqlStart,sqlEnd); m.addAttribute("list",list); return "viewemp"; } }
第二步:修正EmpDao的查询方法(补全SQL参数)
// 如果不想转换日期类型,可直接把方法参数改为java.util.Date,JdbcTemplate会自动适配数据库日期类型 public List<Event> getEmployees(Date start, Date end){ // 新增Object数组传入占位符对应的参数 return template.query("select * from Event where startDate=? and endDate=?", new Object[]{start, end}, new RowMapper<Event>(){ public Event mapRow(ResultSet rs, int row) throws SQLException { Event e=new Event(); e.setEventName(rs.getString(1)); e.setEventOrgName(rs.getString(2)); e.setEventFare(rs.getInt(3)); e.setStartDate(rs.getDate(4)); e.setEndDate(rs.getDate(5)); return e; } }); }
可选优化:统一Event实体类的日期类型
把Event类中Date的导包改为java.util.Date即可,java.sql.Date是java.util.Date的子类,ResultSet.getDate返回的sql.Date可以直接赋值给util.Date属性,不需要额外处理。
内容的提问来源于stack exchange,提问作者Techi
相关产品推荐
相关产品推荐

