답변:
@Controller
클래스를 Spring MVC Controller로 표시하는 데 사용됩니다.@RestController
@Controller
및 @ResponseBody
주석을 추가하는 것 이상을 수행하지 않는 편리한 주석입니다 ( Javadoc 참조 ).따라서 다음 두 컨트롤러 정의는 동일하게 수행되어야합니다.
@Controller
@ResponseBody
public class MyController { }
@RestController
public class MyRestController { }
Thymeleaf
그것은 작동하지 않습니다 @RestController
들 때문에 @ResponseBody
하는이 주석에 포함되어 있습니다.
@ResponseBody
예를 들어 JSON 또는 XML ( source ) 과 같이 본문에있을 수있는 객체로 반환 된 객체 만들기
아래 코드에서 차이점을 보여 드리겠습니다. @controller
@Controller
public class RestClassName{
@RequestMapping(value={"/uri"})
@ResponseBody
public ObjectResponse functionRestName(){
//...
return instance
}
}
과 @RestController
@RestController
public class RestClassName{
@RequestMapping(value={"/uri"})
public ObjectResponse functionRestName(){
//...
return instance
}
}
은 @ResponseBody
기본적으로 활성화됩니다. 함수 서명 위에 추가하지 않아도됩니다.
사용 @RestController
하면보기를 반환 할 수 없습니다 ( Viewresolver
Spring / springboot에서 사용 )@ResponseBody
경우 예가 필요하지 않습니다.
사용 @Controller
하면 Spring web MVC에서보기를 반환 할 수 있습니다.
@RestController
어노테이션이있는 클래스는 동일 @Controller
하지만 @ResponseBody
핸들러 메소드에서 내포됩니다.
실제로, 조심하십시오-정확히 동일하지는 않습니다.
당신이 당신의 응용 프로그램 내에서 모든 인터셉터를 정의하면, 그들은 같은 주석 컨트롤러에 적용되지 않습니다 @RestController
하지만 그들은 함께 일을,@Controller
달린 컨트롤러 합니다.
즉. 인터셉터 구성 :
@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TemplateMappingInterceptor()).addPathPatterns("/**", "/admin-functions**").excludePathPatterns("/login**");
}
}
스프링 컨트롤러 선언에서 :
@Controller
public class AdminServiceController {...
그러나 작동합니다
@RestController
public class AdminServiceController {...
인터셉터와 연관되지 않습니다.
@RestController
Spring 4x에서 소개되었습니다. 이 주석은 또한 자체적으로 주석을 달았 @Controller
으므로 작동하지 않으면 @Controller
버그로보고하십시오.
Interceptor
A를 @RestController
.
Interceptor
했습니다 @RestController
.
Spring 문서 ( Spring RestController Documentation ) 에서 볼 수 있듯이 Rest Controller 주석은 Controller 주석과 동일하지만 @ResponseBody가 기본적으로 활성화되어 있다고 가정하면 모든 json이 Java 객체로 구문 분석됩니다.
@RestController
Spring 4.0.1부터 제공되었습니다. 이 컨트롤러 는 여기서 @RequestMapping 메소드가 기본적으로 @ResponseBody 의미론을 가정 함을 나타냅니다.
이전 버전에서는 다음을 사용하여 유사한 기능을 수행 할 수 있습니다.
@RequestMapping
과 함께 @ResponseBody
같은@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml")
public @ResponseBody MyBean fetch(){
return new MyBean("hi")
}
<mvc:annotation-driven/>
Jackson 또는 xml과 함께 JSON을 사용하는 방법 중 하나로 사용될 수 있습니다.
@XmlRootElement(name = "MyBean")
@XmlType(propOrder = {"field2", "field1"})
public class MyBean{
field1
field2 ..
//getter, setter
}
@ResponseBody
여기서는 MVC에서보기로 취급되며 대신 Dispatcher Servlet에서 발송되는 대신 각 발송자가 text / html, application / xml, application / json과 같은 관련 형식으로 응답을 변환합니다.그러나 Restcontroller는 이미 ResponseBody 및 해당 변환기와 연결되어 있습니다. 두 번째로 응답 본문을 변환하는 대신 자동으로 http 응답으로 변환됩니다.
@Controller
:이 주석은 특수화 된 버전이며 @Component
클래스 경로 스캔을 기반으로 컨트롤러 클래스를 자동 감지 할 수 있습니다.@RestController
:이 주석은 특수한 버전 으로 자동으로 @Controller
추가 @Controller
되고 @ResponseBody
주석 이 추가 되므로 @ResponseBody
매핑 방법 에 추가 할 필요가 없습니다 .@Controller와 @ResponseBody를 사용하는 대신 @RestController를 사용하면 Spring 4.0 이상에서 Rest API를 노출 할 수 있습니다.