Spring项目通过rental_id创建Expenses对象报原始类型参数空转换错误如何解决?
错误原因排查
报错的核心原因是Spring MVC在处理请求参数时,尝试给声明为基本类型int的rental_id赋值null,而基本类型不支持null值,触发类型转换异常。具体问题出在以下几个位置:
- Post接口的参数没有指定绑定规则,且使用了不支持null的基本类型:你写的
@PostMapping方法中int rental_id没有加任何参数绑定注解,Spring默认将其识别为请求参数,且因为是基本类型默认必填,如果你提交的表单没有传递该参数,Spring会尝试注入null直接触发报错。 - Get跳转表单页时没有传递
rental_id到前端:你的@GetMapping方法拿到了路径上的rental_id,但是没有放到Model中返回给前端页面,导致表单提交时没有携带该参数。 - Repository层SQL语法错误:INSERT语句不支持WHERE条件,你当前的写法是完全错误的,插入新记录需要把
rental_id作为插入字段之一写入字段列表。
修复步骤
- 修正Get接口,把
rental_id传到前端
@GetMapping("/createExpenses/{rental_id}") public String createExpenses(@PathVariable("rental_id") int rental_id, Model model){ // 把rental_id存入model,给前端表单用 model.addAttribute("rental_id", rental_id); return "home/createExpenses"; }
- 在前端表单
createExpenses.html中添加隐藏域,提交时携带rental_id
<!-- 放在form标签内部即可 --> <input type="hidden" name="rental_id" th:value="${rental_id}">
- 修正Post接口的参数声明,明确参数绑定规则
@PostMapping("/createExpenses") // 加@RequestParam明确绑定请求参数,要求必填的话无需改为Integer,确保前端传参即可 public String createExpenses(@ModelAttribute Expenses expenses, @RequestParam("rental_id") int rental_id){ expensesService.createExpenses(expenses, rental_id); return "home/succesExpense"; }
- 修正Repository层的插入SQL,把rental_id加入插入字段
public Expenses createExpenses(Expenses e, int rental_id){ // 把rental_id加到插入字段列表,删除错误的WHERE条件 String sql = "INSERT INTO expenses (rental_id, base_cost, rental_end_date, end_time, drop_off, drop_off_extra, km_end, repair_fee, fuel_level, full_price) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"; template.update(sql, rental_id, e.getBase_cost(), e.getRental_end_date(), e.getEnd_time(), e.getDrop_off(), e.getDrop_off_extra(), e.getKm_end(), e.getRepair_fee(), e.getFuel_level(), e.getFull_price()); return null; }
内容的提问来源于stack exchange,提问作者silasmj
相关产品推荐
相关产品推荐

