跳到主要内容

Spring @RestController

介绍

在 Spring 框架中,@RestController 是一个用于构建 RESTful Web 服务的注解。它是 @Controller@ResponseBody 的组合,简化了 REST API 的开发。通过使用 @RestController,你可以轻松地将 Java 对象转换为 JSON 或 XML 格式,并将其作为 HTTP 响应返回给客户端。

备注

@RestController 是 Spring 4.0 引入的注解,专为构建 RESTful 服务而设计。

基本用法

1. 创建一个简单的 REST 控制器

以下是一个使用 @RestController 的简单示例:

java
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class HelloWorldController {

@GetMapping("/hello")
public String sayHello() {
return "Hello, World!";
}
}

在这个示例中,@RestController 注解标记了 HelloWorldController 类,表示它是一个 REST 控制器。@RequestMapping("/api") 指定了该控制器的根路径为 /api,而 @GetMapping("/hello") 则定义了一个处理 GET 请求的方法。

2. 运行并测试

当你启动 Spring Boot 应用程序并访问 http://localhost:8080/api/hello 时,你将看到以下输出:

Hello, World!
提示

确保你的 Spring Boot 应用程序已经正确配置并运行在默认端口 8080 上。

逐步讲解

1. @RestController 的作用

@RestController 注解的作用是将类标记为一个 REST 控制器。它结合了 @Controller@ResponseBody 的功能:

  • @Controller:将类标记为 Spring MVC 控制器。
  • @ResponseBody:将方法的返回值直接写入 HTTP 响应体,而不是渲染视图。

2. 处理不同的 HTTP 方法

除了 @GetMapping,Spring 还提供了其他注解来处理不同的 HTTP 方法,例如:

  • @PostMapping:处理 POST 请求。
  • @PutMapping:处理 PUT 请求。
  • @DeleteMapping:处理 DELETE 请求。

以下是一个处理 POST 请求的示例:

java
@PostMapping("/greet")
public String greet(@RequestParam String name) {
return "Hello, " + name + "!";
}

3. 返回复杂对象

@RestController 不仅可以返回简单的字符串,还可以返回复杂的 Java 对象。Spring 会自动将这些对象转换为 JSON 或 XML 格式。

java
@GetMapping("/user")
public User getUser() {
return new User("John", "Doe");
}

假设 User 类如下:

java
public class User {
private String firstName;
private String lastName;

// 构造函数、getter 和 setter 省略
}

访问 http://localhost:8080/api/user 将返回以下 JSON:

json
{
"firstName": "John",
"lastName": "Doe"
}

实际案例

1. 构建一个简单的用户管理系统

假设我们需要构建一个简单的用户管理系统,支持以下功能:

  • 获取所有用户
  • 添加新用户
  • 根据 ID 获取用户
  • 删除用户

以下是实现代码:

java
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicLong;

@RestController
@RequestMapping("/users")
public class UserController {

private final List<User> users = new ArrayList<>();
private final AtomicLong counter = new AtomicLong();

@GetMapping
public List<User> getAllUsers() {
return users;
}

@PostMapping
public User addUser(@RequestBody User user) {
user.setId(counter.incrementAndGet());
users.add(user);
return user;
}

@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
return users.stream()
.filter(user -> user.getId().equals(id))
.findFirst()
.orElseThrow(() -> new RuntimeException("User not found"));
}

@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) {
users.removeIf(user -> user.getId().equals(id));
}
}

2. 测试 API

你可以使用 Postman 或 curl 命令来测试这些 API:

  • 获取所有用户GET http://localhost:8080/users
  • 添加新用户POST http://localhost:8080/users,请求体为 {"firstName": "John", "lastName": "Doe"}
  • 根据 ID 获取用户GET http://localhost:8080/users/1
  • 删除用户DELETE http://localhost:8080/users/1

总结

@RestController 是 Spring 框架中用于构建 RESTful Web 服务的强大工具。通过本文,你已经学会了如何使用 @RestController 创建简单的 REST API,并处理不同的 HTTP 方法。我们还通过一个实际案例展示了如何构建一个用户管理系统。

警告

在实际开发中,请确保处理异常情况,例如用户未找到或请求参数无效。

附加资源

练习

  1. 扩展用户管理系统,支持更新用户信息(使用 @PutMapping)。
  2. 尝试返回自定义的 HTTP 状态码,例如 201 Created404 Not Found
  3. 使用 @ExceptionHandler 处理自定义异常,并返回适当的错误信息。

祝你学习愉快!