Spring @Controller和@RestController注解的区别

Spring @Controller和@RestController注解的区别

技术背景

在Spring框架中,@Controller@RestController注解都用于标记处理请求的控制器类。随着RESTful架构风格的流行,Spring引入了@RestController注解,以简化RESTful服务的开发。理解这两个注解的区别,有助于开发者根据具体的应用场景选择合适的注解。

实现步骤

1. 使用@Controller注解

@Controller是Spring MVC中用于标记控制器类的注解,通常用于处理传统的Web请求,并返回视图。若要返回数据而非视图,需要结合@ResponseBody注解使用。

1
2
3
4
5
6
7
8
9
10
11
12
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class MyController {
@RequestMapping("/hello")
@ResponseBody
public String hello() {
return "Hello, World!";
}
}

2. 使用@RestController注解

@RestController是一个复合注解,相当于@Controller@ResponseBody的组合。使用该注解的类中的所有处理方法默认都会返回数据而非视图。

1
2
3
4
5
6
7
8
9
10
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MyRestController {
@RequestMapping("/hello")
public String hello() {
return "Hello, World!";
}
}

核心代码

以下是两种注解使用方式的核心代码示例:

使用@Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
@Controller
public class MyController {
@RequestMapping("/view")
public String showView() {
return "viewName"; // 返回视图名
}

@RequestMapping("/data")
@ResponseBody
public String getData() {
return "{\"message\": \"This is data\"}"; // 返回数据
}
}

使用@RestController

1
2
3
4
5
6
7
@RestController
public class MyRestController {
@RequestMapping("/data")
public String getData() {
return "{\"message\": \"This is data\"}"; // 返回数据
}
}

最佳实践

  • 传统Web应用:如果应用需要返回视图(如JSP、Thymeleaf模板等),应使用@Controller注解,并在需要返回数据的方法上添加@ResponseBody注解。
  • RESTful服务:如果应用主要提供RESTful服务,返回JSON、XML等数据格式,应使用@RestController注解,以简化代码。

常见问题

1. 能否在使用@RestController的情况下返回视图?

不能,由于@RestController默认包含@ResponseBody,返回的对象会被序列化为JSON、XML等数据格式,而不会解析为视图名。若要返回视图,应使用@Controller注解。

2. 拦截器对@Controller和@RestController的影响是否相同?

通常情况下,拦截器对二者的影响是相同的。但在某些特殊配置下,可能会出现拦截器对@RestController不生效的情况,需要检查拦截器的配置是否正确。

3. 可以在同一个应用中同时使用@Controller和@RestController吗?

可以,在同一个Spring应用中,可以根据不同的需求同时使用这两个注解。例如,传统的Web页面请求使用@Controller处理,RESTful接口使用@RestController处理。


Spring @Controller和@RestController注解的区别
https://119291.xyz/posts/2025-04-22.difference-between-spring-controller-and-restcontroller-annotation/
作者
ww
发布于
2025年4月22日
许可协议