You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring MVC传递Date参数到Controller出现类型转换异常如何解决

问题根因

  1. 日期格式不匹配:前端<input type="date">控件默认提交的日期格式为yyyy-MM-dd,但Controller中@DateTimeFormat配置的是dd/MM/yyyy,格式对不上导致转换失败
  2. 类型不支持:Spring的@DateTimeFormat注解默认只提供字符串转java.util.Date的转换策略,你Controller参数如果直接声明为java.sql.Date,就会触发找不到转换策略的异常
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:18:03