自学内容网 自学内容网

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)!