现象

  • ✅ 自定义 POJO(如 QueryDTO)作为 Controller 方法参数,不加任何注解 也能正常工作。

  • ❌ 接口 List(或 Map)作为参数,不加注解 就会报错

原因分析

参数类型 Spring 默认处理方式 实例化过程 结果
自定义类(有默认构造器) @ModelAttribute 调用无参构造器创建对象 → 用请求参数匹配 setter 赋值 ✅ 成功
List 接口(无构造器) @ModelAttribute 尝试通过反射获取构造器实例化 → 接口没有构造器 ❌ 抛异常

解决方案

明确告诉 Spring 如何将请求数据转换成 List

// 1. 接收 Query String 多值:?ids=1,2,3 或 ?ids=1&ids=2
public String method(@RequestParam List<String> ids) { ... }

// 2. 接收 JSON 数组:[ "a", "b" ]
public String method(@RequestBody List<String> items) { ... }

// 3. 改用包装类(提供具体实现)
public class Wrapper { private List<String> ids = new ArrayList<>(); /*getter/setter*/ }
public String method(Wrapper wrapper) { ... }   // 仍可无注解

核心结论

Spring 只能自动实例化“有构造器的具体类”;接口或抽象类型必须用 @RequestParam@RequestBody 等注解显式指定数据绑定方式。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐