📜  Spring中@Controller和@RestController注解的区别(1)

📅  最后修改于: 2023-12-03 15:35:03.916000             🧑  作者: Mango

Spring中@Controller和@RestController注解的区别

在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请求,但是它们的返回值类型、默认行为以及简写方式都有所不同。需要根据实际情况选择使用。