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.

Srikanth
źródło

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 { }
Micha
źródło
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.

BERGUIGA Mohamed Amine
źródło
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.

Ravi Wadje
źródło
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.

bertybro
źródło
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.

CAAY
źródło
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.

yancy
źródło
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.

cześć
źródło
2

@Controllerzwraca View. @RestControllerzwraca ResponseBody.

G.Brown
źródło
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.

Dwij Sheth
źródło
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.
Prashant Goswami
źródło
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.

Tharindu Eranga
źródło
-3

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

sambhu
źródło
-3

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

Kawa Beanie
źródło
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