
spring mvc 控制器中误将 model 作为 @requestbody 或 @modelattribute 的目标参数,会导致“no primary or single unique constructor found for interface org.springframework.ui.model”错误——因 model 是接口且不可实例化,必须由 spring 容器自动注入。
spring mvc 控制器中误将 model 作为 @requestbody 或 @modelattribute 的目标参数,会导致“no primary or single unique constructor found for interface org.springframework.ui.model”错误——因 model 是接口且不可实例化,必须由 spring 容器自动注入。
该错误的根本原因在于:您在 @PostMapping("/saveCashier") 方法中错误地对 Model 参数同时添加了 @RequestBody 和 @ModelAttribute 注解:
public String save(@RequestBody @ModelAttribute Model m, Cashier c) { ... }这是非法且语义冲突的操作:
- @RequestBody 用于将 HTTP 请求体(如 JSON)反序列化为一个具体对象(如 Cashier),要求目标类型有可访问的构造函数;
- Model 是 Spring 提供的接口(位于 org.springframework.ui 包),用于向视图传递数据,不能被 JSON 反序列化,也不具备任何构造函数;
- Spring 在尝试解析 @RequestBody Model m 时,会试图为其创建实例,从而抛出 No primary or single unique constructor found 异常。
✅ 正确做法是:Model 必须作为独立、无注解的参数声明在方法签名中,由 Spring 自动注入;而业务对象(如 Cashier)应通过 @ModelAttribute(表单提交)或 @RequestBody(JSON API)接收,二者不可混用于同一参数。
✅ 推荐写法(表单场景,推荐 @ModelAttribute)
@PostMapping("/saveCashier")
public String save(@ModelAttribute Cashier cashier, Model model) {
// 1. 保存收银员
cservice.save(cashier);
// 2. 查询全部收银员并存入 Model(供重定向后的视图使用)
List<Cashier> cashiers = cservice.getAllCashier();
model.addAttribute("cashiers", cashiers); // 注意:key 应为复数形式,与视图逻辑一致
return "redirect:/cashierList";
}✅ 优势:自动绑定 HTML 表单字段(如 → cashier.setName(...)),简洁安全。
✅ 替代写法(REST API 场景,用 @RequestBody)
@PostMapping("/api/saveCashier")
public String save(@RequestBody Cashier cashier, Model model) {
cservice.save(cashier);
model.addAttribute("cashiers", cservice.getAllCashier());
return "redirect:/cashierList";
}⚠️ 注意:@RequestBody 仅适用于 Content-Type: application/json 请求,且需确保 Cashier 类有无参构造器和标准 getter/setter。
❌ 绝对禁止的写法(引发本错误)
// 错误!Model 不可加 @RequestBody 或 @ModelAttribute
public String save(@RequestBody Model model, Cashier c) { ... }
public String save(@ModelAttribute Model model) { ... }? 额外检查点
- 确保 Cashier 类有 public 无参构造函数(Jackson / Spring Data 绑定必需);
- 若使用 Thymeleaf 视图,确认 /cashierList 页面正确遍历 th:each="c : ${cashiers}";
- @ModelAttribute 应作用于 业务对象(如 Cashier),而非 Model、HttpServletRequest 等框架接口。
✅ 总结
Model 是 Spring MVC 的“数据载体接口”,只负责在控制器与视图间传递数据,永远不应被标注为 @RequestBody 或 @ModelAttribute。将其作为无注解参数置于方法签名中,即可由框架自动注入。修复此错误后,应用将正常处理表单提交并完成重定向跳转。

















