当 @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
