Spring的ModelAttribute注解

结城 SpringBoot 14 次阅读 378 字 发布于 2026-04-27 预计阅读时间: 2 分钟


@ModelAttribute 用于 Controller 方法的参数时,它会将 HTTP 请求参数(Query String 或 Form Data)自动填充到 Java Bean 中。

Spring 会实例化该对象,并通过反射调用其 Setter 方法,将同名的请求参数注入。

在现代 Spring Boot 中,如果参数是一个 POJO (且不是简单类型如 String/int​)且没有加其他注解(如 @RequestBody​ 或 @RequestPart​),默认行为就等同于加了 @ModelAttribute​,相较于@RequestParam极大减少了代码量。

例如如下代码

@GetMapping("/page")
public Result<PageResult> page(RechargeActivityQueryDTO query) {
    log.info("查询活动列表, query: {}", query);
    return Result.success(activityService.pageActivities(query));
}

即便你没有显式指定前面的注解,你在前端使用查询字符串传参的时候,后端会自动识别并等同于添加该注解

@GetMapping("/page")
public Result<PageResult> page(@ModelAttribute RechargeActivityQueryDTO query) {
    log.info("查询活动列表, query: {}", query);
    return Result.success(activityService.pageActivities(query));
}

虽然不写也行,spring在执行的时候会自动理解含义最终执行的效果相同,但建议开发过程中还是建议显式书写,便于后期维护和理解,告诉开发者这个对象是通过解析 URL 上的多个 Query 参数构建出来的。

总的来说就是,解析URL查询参数这种,无论你是一个DTO对象接收还是简单的@RequestParam​,只要名称相同写不写都无所谓spring会自动帮你处理,解析JSON数据,必须要显式指定注解@RequestBody

给时光以生命,给岁月以文明
最后更新于 2026-06-15