Spring MVC中常用注解_笔记
1. @PathVariable
- 功能:用于将URL中的模板变量绑定到方法的参数上。
- 适用场景:RESTful风格的URL,例如获取特定资源的详细信息。
- 注意事项:
- 确保URL模板中的变量名与方法参数名一致,或使用
@PathVariable("variable")方式
指定。 - 默认参数必填,需用
required=false
设为可选 - 支持类型自动转换(String → Integer/Long 等)
- 确保URL模板中的变量名与方法参数名一致,或使用
- 示例:
@GetMapping("/users/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {// 从数据库获取用户信息User user = userService.findById(id);return ResponseEntity.ok(user);
}// /users/123 → id=123
2. @RequestParam
- 功能:用于获取URL中的查询参数(Query Parameters)或者表单数据。
- 适用场景:需要获取一个或多个简单类型的参数(如字符串、整数等)。
- 注意事项:
- 参数默认是必需的,可以通过
required = false
设置为可选。 - 可以设置默认值(
defaultValue
)。 - 支持集合类型(
List<String>
)
- 参数默认是必需的,可以通过
示例:
@GetMapping("/users")
public ResponseEntity<List<User>> searchUsers(@RequestParam(required = false) String name,@RequestParam(defaultValue = "0") int page) {// 根据名称和分页查询用户List<User> users = userService.search(name, page);return ResponseEntity.ok(users);
}// /users?name=Alice&page=2
3. @RequestHeader
- 功能:用于获取HTTP请求头信息。
- 适用场景:需要访问请求头中的特定字段,如
Content-Type
、Authorization
等。 - 注意事项:
- 支持所有标准 HTTP 头(User-Agent, Accept-Language 等)
- 同样可以设置
required
和defaultValue
。
- 示例:
@GetMapping("/info")
public ResponseEntity<String> getInfo(@RequestHeader("User-Agent") String userAgent) {// 处理请求头中的User-Agentreturn ResponseEntity.ok("User-Agent: " + userAgent);
}
4. @CookieValue
- 功能:用于获取HTTP请求中的Cookie值。
- 适用场景:会话管理、追踪等场景,需要从Cookie中读取数据,例如会话ID。
- 注意事项:
- 可以设置
required
和defaultValue
。 - 需确保 Cookie 存在(或设
required=false
) - 支持 Cookie 对象访问
- 可以设置
- 示例:
@GetMapping("/demo")
public ResponseEntity<String> readCookie(@CookieValue("JSESSIONID") String sessionId) {// 使用会话ID进行一些操作return ResponseEntity.ok("Session ID: " + sessionId);
}
5. @ModelAttribute
- 功能:
- 在方法参数上:将请求参数绑定到模型对象(通常用于表单提交)。
- 在方法上:在控制器方法执行前自动向模型添加属性。
- 适用场景:
- 处理表单提交,自动将表单字段绑定到对象。
- 在多个请求处理方法前准备通用模型数据。
- 注意事项:
- 自动应用数据绑定和验证
- 支持级联属性绑定(user.address.city)
- 绑定过程中会进行类型转换,如果转换失败会抛出异常。
- 方法级使用可预加载模型数据
- 示例
// 方法参数
@PostMapping("/users")
public String createUser(@ModelAttribute User user) {// 绑定表单数据到User对象userService.save(user);// 保存用户return "redirect:/users";
}// 方法级(预加载数据)
@ModelAttribute("categories")
public List<String> populateCategories() {return Arrays.asList("Admin", "User", "Guest");
}
6. @SessionAttribute
- 功能:用于访问预先存储在会话中的属性。
- 适用场景:跨请求数据共享,如在多个请求之间共享用户登录信息。
- 注意事项:
- 需要确保属性已经存在于会话中,否则会抛出异常。
- 示例:
@GetMapping("/dashboard")
public String dashboard(@SessionAttribute("user") User user) {// 使用会话中的用户信息return "dashboard";
}
7. @RequestPart
- 功能:用于将
multipart/form-data
请求中的部分(如文件)绑定到方法参数。 - 适用场景:文件上传,同时可能伴随其他表单字段。
- 注意事项:
- 通常与
MultipartFile
一起使用,用于接收 MultipartFile 对象 - 支持多个文件(
MultipartFile[]
)。
- 通常与
- 示例:
@PostMapping("/upload")
public ResponseEntity<String> uploadFile(@RequestPart("file") MultipartFile file,@RequestPart("metadata") String metadata) { // metadata可以是JSON字符串// 处理上传文件return ResponseEntity.ok("File uploaded!");
}
8. @RequestBody
- 功能:将HTTP请求体(如JSON)绑定到方法参数的Java对象上。
- 适用场景:处理非表单数据(如JSON或XML)的POST/PUT请求。
- 注意事项:
- 需要配置消息转换器(如
MappingJackson2HttpMessageConverter
)来解析JSON。 - 不支持GET请求,因为GET请求没有请求体。
- 通常与 DTO 对象配合使用
- 需要配置消息转换器(如
- 示例:
@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody User user) {// 创建用户User savedUser = userService.save(user);return ResponseEntity.ok(savedUser);
}
9. @ResponseBody
- 功能:将方法返回的对象直接写入HTTP响应体(如JSON或XML)。
- 适用场景:构建RESTful API,返回数据而非视图名称。
- 注意事项:
- 通常与
@RestController
一起使用(该注解组合了@Controller
和@ResponseBody
)。 - 支持异步处理
- 通常与
- 示例:
@RestController // 类级别包含@ResponseBody
public class UserController {@GetMapping("/users/{id}")public User getUser(@PathVariable Long id) {return userService.findById(id);}
}@Controller
@ResponseBody //在@Controller中需显式声明
public class UserController {@GetMapping("/users/{id}")public User getUser(@PathVariable Long id) {return userService.findById(id);}
}
10. @RestController
- 功能:组合注解,包含
@Controller
和@ResponseBody
,表示该类是一个控制器,且所有方法返回值直接写入响应体。 - 适用场景:构建RESTful Web服务。
- 注意事项:不需要在方法上重复使用
@ResponseBody
。 - 示例:
@RestController
@RequestMapping("/api")
public class ApiController {// 所有方法都自动使用@ResponseBody
}
11. @ExceptionHandler
- 功能:处理控制器内的异常
- 适用场景:统一错误处理
- 注意事项:
- 仅作用于当前控制器
- 全局处理需搭配
@ControllerAdvice
- 可指定处理的异常类型
- 示例
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFound(ResourceNotFoundException ex) {return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new ErrorResponse(ex.getMessage()));
}
总结
正确选择注解可显著提升开发效率和代码可维护性。实际开发中:
- REST API 优先使用
@PathVariable
+@RequestBody
+@ResponseBody
- 传统 Web 应用多用
@ModelAttribute
+@RequestParam
- 文件上传必用
@RequestPart
- 全局异常处理结合
@ExceptionHandler
和@ControllerAdvice
相关阅读
Spring Cloud OpenFeign 常用注解_笔记-CSDN博客