📅  最后修改于: 2023-12-03 15:35:03.916000             🧑  作者: Mango
在Spring框架中,有两种常用的注解来声明控制器类:@Controller
和@RestController
。这两个注解的作用类似,但是有一些不同点。本文将介绍这两个注解的不同点。
首先,让我们先回顾一下这两个注解的共同点。@Controller
和@RestController
都可以被用来标记一个控制器类,用于处理HTTP请求,并返回响应给客户端。
下面是一个用@Controller
注解标记的简单示例:
@Controller
public class UserController {
@GetMapping("/users/{userId}")
public String getUser(@PathVariable int userId, Model model) {
// ...
return "user-details";
}
}
下面是一个用@RestController
注解标记的简单示例:
@RestController
public class UserController {
@GetMapping("/users/{userId}")
public User getUser(@PathVariable int userId) {
// ...
return user;
}
}
可以看到,两个例子都包含一个@GetMapping
注解的方法,这个方法会处理HTTP GET请求,返回相应的结果。其中,@Controller
注解的控制器方法返回的是视图名称,而@RestController
注解的控制器方法直接返回对象。
接下来,我们就来介绍一下这两个注解之间的不同点。
首先,@Controller
注解的控制器方法返回的是视图名称,而@RestController
注解的控制器方法直接返回对象。
以前面的示例为例,@Controller
注解的控制器方法返回的是一个字符串,它是一个视图名称:
@Controller
public class UserController {
@GetMapping("/users/{userId}")
public String getUser(@PathVariable int userId, Model model) {
// ...
return "user-details";
}
}
而@RestController
注解的控制器方法返回的是一个实际的Java对象,它会被序列化成JSON对象并返回给客户端:
@RestController
public class UserController {
@GetMapping("/users/{userId}")
public User getUser(@PathVariable int userId) {
// ...
return user;
}
}
这个Java对象可以是任何对象,任何对象都可以被序列化成JSON格式的响应。
其次,@Controller
注解的控制器方法默认情况下会将返回值解释为视图名称,然后使用相应的视图解析器来解析它。
而@RestController
注解的控制器方法默认情况下会将返回值序列化为JSON格式,并使用Content-Type: application/json
来设置响应头的MIME类型。
最后,对于简单的RESTful API来说,@RestController
注解提供了一种更简单的方式来声明它们。
下面是一个用@Controller
注解实现的简单的RESTful API示例:
@Controller
public class UserController {
@GetMapping("/users/{userId}")
@ResponseBody
public User getUser(@PathVariable int userId) {
// ...
return user;
}
}
这个例子包含了一个@ResponseBody
注解,它告诉Spring MVC将返回值解释为响应体,而不是视图名称。
相较而言,使用@RestController
注解就更加简单了,就像前面所示:
@RestController
public class UserController {
@GetMapping("/users/{userId}")
public User getUser(@PathVariable int userId) {
// ...
return user;
}
}
这里不需要使用@ResponseBody
注解,因为@RestController
注解本身就会告诉Spring MVC将返回值序列化为JSON格式的响应。
在这篇文章中,我们介绍了Spring中@Controller
和@RestController
注解的区别。虽然它们都可以用于标记控制器方法来处理HTTP请求,但是它们的返回值类型、默认行为以及简写方式都有所不同。需要根据实际情况选择使用。