[java] 스프링 @Controller와 @RestController 주석의 차이점

@Controller과 봄의 차이@RestController 주석의 .

@ControllerWeb MVC 및 REST 애플리케이션 모두에 주석을 사용할 수 있습니까 ?
그렇다면 Web MVC 또는 REST 응용 프로그램인지 어떻게 구별 할 수 있습니까?



답변

  • @Controller 클래스를 Spring MVC Controller로 표시하는 데 사용됩니다.
  • @RestController@Controller@ResponseBody주석을 추가하는 것 이상을 수행하지 않는 편리한 주석입니다 ( Javadoc 참조 ).

따라서 다음 두 컨트롤러 정의는 동일하게 수행되어야합니다.

@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }


답변

아래 코드에서 차이점을 보여 드리겠습니다. @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하면보기를 반환 할 수 없습니다 ( ViewresolverSpring / 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 {...

인터셉터와 연관되지 않습니다.


답변

Spring 문서 ( Spring RestController Documentation ) 에서 볼 수 있듯이 Rest Controller 주석은 Controller 주석과 동일하지만 @ResponseBody가 기본적으로 활성화되어 있다고 가정하면 모든 json이 Java 객체로 구문 분석됩니다.


답변

Spring4 +의 새로운 @RestController 주석은 클래스를 컨트롤러로 표시하여 모든 메소드가 뷰 대신 도메인 객체를 반환합니다. @Controller와 @ResponseBody의 줄임말입니다.