Хотя на каждой странице в интернете написано, что @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");
}
}
Я получил ниже вывод вКонсоль:
Привет
Во-вторых, я попытался с @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");
}
}
Я получил ошибку на почтальоне:
{
"timestamp": 1570998345860,
"status": 405,
"error": "Method Not Allowed",
"message": "Request method 'POST' not supported",
"path": "/testController"
}
Если обе аннотации одинаковы, то почему есть разница в выводе ??
Ниже приведен исходный код @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 {
}
Возможно, это должно быть связано с DispatcherServlet. Возможно, что сервлет-диспетчер проверяет только URL-адреса в аннотированных классах @RestController.