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.