@RestController 和 @Component 之间的细微差别

ASh*_*ma7 5 java spring annotations spring-annotations spring-boot

虽然网上每个页面都说@RestController是@Component的规范,但我不知道它是否与DispatcherServlet有关。但是当我通过在 @RestController 和 @Component 之间切换来尝试下面的代码时,我没有看到相同的行为:

首先我尝试使用@RestController:

@RestComponent
public class TestController {
    @RequestMapping(value="/testController", method=RequestMethod.POST,consumes=MediaType.APPLICATION_JSON_VALUE)
    public void testController() {
        System.out.println("Hello");
    }

}
Run Code Online (Sandbox Code Playgroud)

我在控制台中得到以下输出:

你好

其次我尝试使用@Component + @ResponseBody:

@Component
@ResponseBody
public class TestController {
    @RequestMapping(value="/testController", method=RequestMethod.POST,consumes=MediaType.APPLICATION_JSON_VALUE)
    public void testController() {
        System.out.println("Hello");
    }
}
Run Code Online (Sandbox Code Playgroud)

我在邮递员上收到错误:

{
    "timestamp": 1570998345860,
    "status": 405,
    "error": "Method Not Allowed",
    "message": "Request method 'POST' not supported",
    "path": "/testController"
}
Run Code Online (Sandbox Code Playgroud)

如果两个注释相同,那么为什么输出存在差异?

下面是 @RestController 和 @Controller 的源代码,可以看出 @RestController 和 @Controller 都是 @Component 的规范:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {

}


@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
}
Run Code Online (Sandbox Code Playgroud)

也许它必须与DispatcherServlet有关。Dispatcher Servlet 可能只检查 @RestController 注解的类中的 URL。

Mar*_*hac 2

仅仅因为@RestController它是一个@Component并不意味着您可以通过切换到更广泛的功能来实现相同的功能@Component。即使添加了@ResponseBody,您也无法实现等效的功能(如通过POST不支持的请求方法所表示的)。

替换@Component@Controller,因为 a与+@RestController具有完全相同的功能。您还可以在 的元注释中看到这一点,您会看到它是元注释的,而不仅仅是。反过来,用 进行元注释。@Controller@ResponseBody@RestController@Controller@Component@Controller@Component