Spring学习笔记_35——@RestController
1. 介绍
SpringMVC基于@Controller注解和@ResponseBody注解扩展了@RestController注解,使得@RestController注解同时具备于@Controller注解和@ResponseBody注解的功能。
当一个类被标记为@RestController
,意味着其处理的所有方法都将自动添加@ResponseBody
效果,即方法的返回值不再被解释为视图名,而是直接序列化成JSON、XML或其他媒体类型的数据,然后以HTTP响应体的形式返回给客户端
2. 场景
@RestController
主要用于构建 RESTful Web 服务,方法返回的是数据,通常以 JSON 或 XML 格式进行输出。- 它简化了控制器的创建,使得编写 RESTful Web 服务变得更加直观和简洁。
3. 源码
/**
* @author Rossen Stoyanchev
* @author Sam Brannen
* @since 4.0
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
/**
* @since 4.0.1
*/
// 指定注入IOC容器时的Bean的唯一标识。
@AliasFor(annotation = Controller.class)
String value() default "";
}
4. @Controller 与 @RestController 比较
- 返回值处理
@Controller
注解的方法返回的是一个视图名称或模板文件,通常用于构建传统的 Web 应用程序,处理请求并渲染视图。@RestController
注解的方法返回的是数据,通常是以 JSON、XML 等形式进行输出,而不是视图。
- 默认行为
- 在
@Controller
注解下,默认情况下,方法返回的字符串将作为视图名称进行解析,并由视图解析器进行渲染。 - 在
@RestController
注解下,默认情况下,方法返回的对象将会被转换为 JSON 或 XML 格式的响应,通过 HTTP 响应直接返回给客户端,而不进行视图解析。
- 在
- 应用场景
@Controller
注解适用于传统的 Web 应用程序,处理请求并渲染视图。@RestController
注解适用于构建 RESTful Web 服务,返回数据而不是视图。
- 注解组合
@RestController
注解是@Controller
和@ResponseBody
的组合,因此它继承了这两个注解的功能。- 使用
@RestController
注解的类不需要再额外添加@ResponseBody
注解,因为@RestController
已经包含了这一功能。
5. Demo
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserRestController {
@GetMapping("/users")
public List<User> getUsers() {
// 假设这里从数据库获取用户列表
List<User> users = Arrays.asList(new User(1, "张三"), new User(2, "李四"));
return users; // 返回用户列表,Spring会自动转换为JSON格式
}
static class User {
private int id;
private String name;
public User(int id, String name) {
this.id = id;
this.name = name;
}
// Getters and Setters
}
}
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.ArrayList;
@RestController
@RequestMapping("/users")
public class UserController {
// 模拟数据库中的用户列表
private static final List<User> users = new ArrayList<>();
// 获取用户列表
@GetMapping
public List<User> getAllUsers() {
return users;
}
// 根据ID获取单个用户信息
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
return users.stream()
.filter(user -> user.getId().equals(id))
.findFirst()
.orElseThrow(() -> new RuntimeException("User not found with id " + id));
}
// 创建新用户
@PostMapping
public User createUser(@RequestBody User user) {
users.add(user);
return user;
}
}
原文地址:https://blog.csdn.net/LuckyLay/article/details/143739497
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!