@modelattribute用于控制器方法执行前预处理并注入公共数据到model,不依赖路径映射、不返回视图;支持返回值自动存入(默认类名小写为key)或显式指定key,也支持无返回值手动addattribute;可初始化表单绑定对象并自动查库回显,配合binding=false禁用参数绑定以保护只读字段;还可通过@controlleradvice实现跨控制器复用。

@ModelAttribute 预处理数据,核心是在控制器方法执行前,把需要的公共数据或业务对象提前准备好并放入 Model,后续视图或参数绑定可直接使用。它不依赖请求路径映射,也不返回视图,只专注“铺数据”。
在控制器方法上用 @ModelAttribute 添加预设数据
这类方法会在所有 @RequestMapping 方法之前自动调用,适合填充下拉选项、时间戳、系统配置等通用信息。
- 返回值方式:方法返回一个对象,Spring 自动以类名首字母小写为 key 存入 Model(如返回 User 对象,默认 key 是 user)
- 显式指定 key:用 @ModelAttribute("userTypes") 控制存入 Model 的键名
- 无返回值方式:方法签名带 Model 参数,手动调用 model.addAttribute(...),可一次加多个属性
用 @ModelAttribute 初始化表单绑定对象
当页面是编辑已有记录(比如用户资料页),需要先查出原始数据再渲染表单,避免空对象导致字段丢失或被覆盖为 null。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 在 GET 请求方法中,通过 @ModelAttribute 参数自动触发查找逻辑
- 例如:@GetMapping("/edit/{id}") 方法参数写 @ModelAttribute User user,Spring 会先尝试从 Model 中找 user;若不存在,则调用同控制器内已定义的 @ModelAttribute User 方法(如根据 id 查询数据库)来创建并放入 Model
- 这样视图拿到的 user 就是完整、非空的对象,表单字段能正确回显
配合 binding = false 控制是否绑定请求参数
默认情况下,@ModelAttribute 参数会自动绑定请求中的同名参数。但有些场景你只想取对象,不希望请求参数覆盖它(比如编辑时禁止修改创建时间)。
- 加上 @ModelAttribute(binding = false),Spring 仍会尝试从 Model 获取或创建对象,但跳过后续的请求参数绑定步骤
- 适合保护只读字段、防止恶意提交篡改关键属性
跨控制器复用:放在 @ControllerAdvice 中
如果多个控制器都需要相同的预加载逻辑(如全局菜单、当前登录用户、语言列表),可把 @ModelAttribute 方法移到 @ControllerAdvice 类里。
- 该类中标注的方法会对所有控制器生效
- 避免重复代码,统一维护点清晰










