现象

  • ✅ 自定义 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编程工具,助力开发者即刻编程。

更多推荐