Różnica między adnotacją @Controller a @RestController


356

Różnica między wiosną @Controllera @RestControlleradnotacją.

Czy @Controlleradnotacji można używać zarówno w aplikacjach Web MVC, jak i REST?
Jeśli tak, w jaki sposób możemy rozróżnić, czy jest to aplikacja Web MVC czy REST.

Odpowiedzi:


471
  • @Controller służy do oznaczania klas jako kontrolera Spring MVC.
  • @RestControllerto wygodna adnotacja, która nie robi nic więcej niż dodawanie adnotacji @Controlleri @ResponseBody(patrz: Javadoc )

Zatem dwie poniższe definicje kontrolera powinny zrobić to samo

@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }


48
Myślę, że @RestController również automatycznie konwertuje odpowiedź na JSON / XML.
arnabkaycee

1
Po prostu udostępniam link do wiosennego samouczka wyjaśniającego różnicę spring.io/guides/gs/rest-service
Mina Samy

9
Również jeśli używasz silnika szablonów, taki jak Thymeleaften nie będzie działał z @RestControllerpowodu tego @ResponseBodyzawartego w tej adnotacji.
Sonique

3
@ResponseBodysprawia, że ​​zwrócone obiekty stają się czymś, co może znajdować się w ciele, np. JSON lub XML ( źródło )
Martin Thoma

59

W poniższym kodzie pokażę różnicę między @controller

@Controller
public class RestClassName{

  @RequestMapping(value={"/uri"})
  @ResponseBody
  public ObjectResponse functionRestName(){
      //...
      return instance
   }
}

i @RestController

@RestController
public class RestClassName{

  @RequestMapping(value={"/uri"})
  public ObjectResponse functionRestName(){
      //...
      return instance
   }
}

@ResponseBodyjest włączona domyślnie. Nie musisz dodawać go powyżej podpisu funkcji.


1
Nazwy klas w Javie powinny zaczynać się wielkimi literami, tj. RestClassName (nie restClassName).
Razzle

24

Jeśli używasz @RestController, nie możesz zwrócić widoku (używając ViewresolverSpring / Springboot) i tak @ResponseBodynie jest potrzebne w tym przypadku.

Jeśli używasz @Controller, możesz zwrócić widok w Spring web MVC.


Tak, @ResponseBody można umieścić na metodzie i wskazuje, że typ zwracany powinien być zapisany bezpośrednio w treści odpowiedzi HTTP (a nie umieszczany w modelu ani interpretowany jako nazwa widoku)
PraveenKumar Lalasangi


14

Właściwie uważaj - nie są dokładnie takie same.

Jeśli zdefiniujesz jakieś przechwytywacze w swojej aplikacji, nie będą one miały zastosowania do kontrolerów z adnotacjami @RestController, ponieważ działają one jednak z @Controllerkontrolerami z adnotacjami.

to znaczy. konfiguracja przechwytywacza:

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TemplateMappingInterceptor()).addPathPatterns("/**", "/admin-functions**").excludePathPatterns("/login**");
    }

}

oraz w deklaracji kontrolera wiosennego:

@Controller
public class AdminServiceController {...

Będzie jednak działać

@RestController
public class AdminServiceController {...

nie ma z nim skojarzonego przechwytywacza.


2
@RestControllerzostał wprowadzony wiosną 4x. Ta adnotacja również jest opatrzona adnotacją, @Controllerwięc jeśli nie działa jak @Controllerwtedy, zgłoś to jako błąd.
gaoagong

@bertybro, to nie do końca prawda. Możesz powiązać Interceptorz @RestController.
Ravi-A-Doer

Z pewnością udało mi się dołączyć Interceptordo @RestController.
Ben Barden

11

Jak widać w dokumentacji Spring (dokumentacja Spring RestController ) Odpoczynek Adnotacja kontrolera jest taka sama jak adnotacja kontrolera, ale przy założeniu, że @ResponseBody jest domyślnie aktywny, więc wszystkie pliki JSON są analizowane do obiektów Java.


4

Nowa adnotacja @RestController w Spring4 +, która oznacza klasę jako kontroler, w którym każda metoda zwraca obiekt domeny zamiast widoku. To skrót dla @Controller i @ResponseBody zwinięte razem.


3

@RestControllerbył dostarczany od wiosny 4.0.1. Kontrolery te wskazują, że tutaj metody @RequestMapping domyślnie przyjmują semantykę @ResponseBody.

We wcześniejszych wersjach podobną funkcjonalność można było uzyskać, stosując poniższe:

  1. @RequestMappingw połączeniu z @ResponseBodypodobnymi@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml") public @ResponseBody MyBean fetch(){ return new MyBean("hi") }

  2. <mvc:annotation-driven/> może być używany jako jeden ze sposobów używania JSON z Jacksonem lub XML.

  3. MyBean można zdefiniować jak

@XmlRootElement(name = "MyBean") @XmlType(propOrder = {"field2", "field1"}) public class MyBean{ field1 field2 .. //getter, setter }

  1. @ResponseBody jest tutaj traktowany jako widok między MVC i jest wysyłany bezpośrednio zamiast wysyłany z serwletu Dispatchera, a odpowiednie konwertery konwertują odpowiedź w odpowiednim formacie, takim jak tekst / html, application / xml, application / json.

Jednak Restcontroller jest już połączony z ResponseBody i odpowiednimi konwerterami. Po drugie, ponieważ zamiast konwertować odpowiedź, jest ona automatycznie konwertowana na odpowiedź HTTP.


2

@Controllerzwraca View. @RestControllerzwraca ResponseBody.


2
Powinieneś wyjaśnić więcej. Jak to odpowiada na pytanie?
Yunnosch,

@ Yunnosch „widok” to Twój interfejs, taki jak jsp lub html. ResponseBody może być xml, json, yaml
G.Brown

Proszę edytować swoje odpowiedzi, aby dodać pomocne informacje. Jednak nadal nie rozumiem, jak powinien odpowiedzieć na pytanie. Czy mógłbyś sformułować wyjaśnienie w rodzaju „Tak, możesz / Nie, nie możesz, ponieważ ...”?
Yunnosch,

1

Adnotacja @RestController została wprowadzona wiosną 4.0, aby uprościć tworzenie usług sieciowych RESTful. To wygodna adnotacja, która łączy @Controller i @ResponseBody - co eliminuje potrzebę adnotacji każdej metody obsługi żądań klasy kontrolera za pomocą adnotacji @ResponseBody.


0
  • @Controller: Ta adnotacja jest tylko specjalistyczną wersją @Componenti umożliwia automatyczne wykrywanie klas kontrolerów na podstawie skanowania ścieżki klas.
  • @RestController: Ta adnotacja to specjalistyczna wersja, @Controllerktóra automatycznie dodaje @Controlleri @ResponseBodyadnotacje, więc nie musimy dodawać @ResponseBodydo naszych metod mapowania.

0

@Controller jest używany w starszych systemach, które używają stron JSP. może zwrócić widoki. @ RestController oznacza, że ​​kontroler zapewnia usługi REST z typem odpowiedzi JSON. więc łączy w sobie adnotacje @Controller i @ResponseBody.


-3

@RestControllerjest kompozycją, @Controllera @ResponseBodyjeśli nie używamy @ResponseBodypodpisu w metodzie, musimy użyć @Restcontroller.


-3

Zamiast używać @Controller i @ResponseBody, @RestController pozwala Ci ujawnić API Rest w Spring 4.0 i nowszych wersjach.


Chcesz powiedzieć, że myślę, że @RestController również automatycznie konwertuje odpowiedź na JSON / XML. ? użyłeś abstrakcyjnego zdania zamiast go jasno wyjaśnić, nie sugeruję tego.
cinqS,

Pomyśl o tym, @Controller robi to samo, co zajmuje hte produkuje i zużywa typy MIME JSON / XML lub w inny sposób ... @ ResponseBody mówi kontrolerowi, aby zachowywał się jak punkt końcowy REST bez tworzenia widoku. RestController domyślnie to robi.
CoffeeBeanie
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.