Spring中Controller层中容易搞混的注解
一、@RequestBody和@ResponseBody
1.@RequestBody:
用于将 HTTP 请求体(通常是 JSON 或 XML 格式) 中的数据 绑定到一个 Java 对象上,并将其传递给控制器方法的参数上
@PostMapping("/users")
public ResponseEntity<String> createUser(@RequestBody User user) {// 这里的 user 对象会自动从请求体中的 JSON 数据映射过来return ResponseEntity.ok("User created: " + user.getName());
}
客户端发送的请求示例(JSON):
{"name": "Alice","age": 25
}
2.@ResponseBody:
表示方法的返回值不是视图名称,而是直接作为 HTTP 响应体返回给客户端(比如返回 JSON 或 XML 数据)
@GetMapping("/user/{id}")
@ResponseBody
public User getUser(@PathVariable Long id) {User user = userService.findById(id);return user; // 返回的 User 对象会被自动转换为 JSON
}
说明:
如果方法标注了
@ResponseBody
,Spring 会使用消息转换器(如 Jackson)将返回的对象序列化为 JSON 或 XML,然后写入 HTTP 响应体。在 Spring Boot 的
@RestController
注解中,所有方法默认都带有 @ResponseBody 的效果,所以不需要再显式写。
二、@PathVariable和@RequestParam
1.@PathVariable:
用于从 URL 路径模板中提取变量值,通常用于 RESTful 风格的 URL。当你希望 URL 中包含动态参数时(如 /user/123
,其中 123
是用户ID),可以使用 @PathVariable
获取这个值。
@GetMapping("/user/{id}")
public User getUserById(@PathVariable Long id) {return userService.findById(id);
}
访问 URL 示例:
GET /user/1001
说明:
{id}
是路径变量,@PathVariable Long id
表示将 URL 中的1001
绑定到参数id
上。可以指定变量名,如
@PathVariable("id")
,但若变量名一致可省略。
2.@RequestParam:
用于从 URL 的查询参数(即 ?key=value 形式)中提取值.当客户端通过 GET 请求的查询字符串传参(如 /user?name=Alice&age=25
),你可以使用 @RequestParam
来获取这些参数。
@GetMapping("/user")
public List<User> findUsers(@RequestParam String name,@RequestParam(defaultValue = "18") int age) {// 根据 name 和 age 查找用户return userService.findByNameAndAge(name, age);
}
访问 URL 示例:
GET /user?name=Alice&age=25
说明:
参数名默认与方法参数名相同,也可以显式指定,如
@RequestParam("name") String userName
。支持设置默认值:
@RequestParam(defaultValue = "18") int age
,如果客户端未传 age,则默认为 18。该注解常用于 GET 请求的筛选、分页、排序等参数传递。