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

Różnica między sprężyną @Controller a @RestController Przypisy

Czy adnotacja @Controller może być używana zarówno w aplikacjach Web MVC jak i REST?
Jeśli tak, to jak możemy rozróżnić, czy jest to Web MVC czy aplikacja REST.

Author: naXa, 2014-08-11

12 answers

  • @Controller jest używany do oznaczania klas jako kontroler MVC Spring.
  • @RestController jest wygodną adnotacją, która nie robi nic więcej niż dodanie @Controller i @ResponseBodyadnotacji (patrz: Javadoc )

Więc poniższe dwie definicje kontrolera powinny zrobić to samo

@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }
 382
Author: micha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-11 15:18:51

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

@Controller
public class restClassName{

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

Oraz @RestController

@RestController
public class restClassName{

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

@ResponseBody jest domyślnie aktywowana. Nie musisz dodawać go nad podpisem funkcji.

 41
Author: BERGUIGA Mohamed Amine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-23 08:00:56

@RestController klasy z adnotacjami są takie same jak @Controller, ale @ResponseBody w metodach obsługi są implikowane.

 17
Author: Bart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-11 11:41:13

Właściwie, bądź ostrożny - nie są dokładnie takie same.

Jeśli zdefiniujesz jakiekolwiek interceptory w swojej aplikacji, nie będą one miały zastosowania do kontrolerów z adnotacją @RestController, jednak działają one z kontrolerami z adnotacją @Controller.

Ie. konfiguracja dla Interceptora:

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {


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

}

I w deklaracji kontrolera sprężyny:

@Controller
public class AdminServiceController {...

Będzie działać, jednak

@RestController
public class AdminServiceController {...

Nie oznacza, że interceptor jest z nim powiązany.

 12
Author: bertybro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-04 04:42:22

Jak widać w dokumentacji Spring (Spring RestController Documentation) adnotacja kontrolera Rest jest taka sama jak adnotacja kontrolera, ale zakładając, że @ResponseBody jest domyślnie aktywna, więc wszystkie json są przetwarzane do obiektów java.

 8
Author: CAAY,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-11 11:41:56

Jeśli używasz @ RestController nie możesz zwrócić widoku (używając Viewresolver w Spring/springboot) i tak @ ResponseBody nie jest potrzebne w tym przypadku.

Jeśli używasz @ controller, możesz zwrócić widok w Spring webMVC.

 8
Author: Ravi Wadje,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-27 11:54:05

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

 4
Author: yancy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-18 08:59:06

@RestController został udostępniony od wiosny 4.0.1. te kontrolery wskazują, że tutaj metody @ RequestMapping domyślnie przyjmują semantykę @ ResponseBody.

We wcześniejszych wersjach podobną funkcjonalność można było uzyskać za pomocą poniższego kodu:

  1. @RequestMapping w połączeniu z @ResponseBody Jak @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ć następująco

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

  1. @ResponseBody jest traktowany jako Widok pomiędzy MVC i jest wysyłany bezpośrednio zamiast wysyłany z serwletu dyspozytora, a odpowiednie Konwertery konwertują odpowiedź w pokrewnym formacie, takim jak text/html, application/xml, application/json .

Jednak Restcontroller jest już połączony z ResponseBody i odpowiednimi konwerterami. Po drugie, tutaj, ponieważ zamiast konwertować responsebody, automatycznie konwersja do odpowiedzi http.

 2
Author: hi.nitish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-16 11:21:08
  • @Controller: ta adnotacja jest tylko wyspecjalizowaną wersją @Component i umożliwia automatyczne wykrywanie klas kontrolera na podstawie skanowania classpath.
  • @RestController: Ta adnotacja jest wyspecjalizowaną wersją @Controller, która automatycznie dodaje adnotację @Controller i @ResponseBody, więc nie musimy dodawać @ResponseBody do naszych metod mapowania.
 0
Author: Prashant Goswami,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-23 10:19:54

Klasa jest oznaczona jako @RestController, co oznacza, że jest gotowa do użycia przez Spring MVC do obsługi żądań internetowych.@RequestMapping maps / to the index() method. Po wywołaniu z przeglądarki lub za pomocą curl w wierszu poleceń, metoda zwraca czysty tekst. Dzieje się tak dlatego, że @RestController łączy @Controller i @ResponseBody, dwie adnotacje, które powodują, że żądania sieciowe zwracają dane, a nie Widok.

 0
Author: Vajahat Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-27 08:35:52

@RestController jest składnikiem @Controller i @ResponseBody, jeśli nie używamy @ResponseBody w podpisie metody, to musimy użyć @Restcontroller.

 -2
Author: sambhu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-02 16:27:30

Zamiast używać @Controller i @ResponseBody, @ RestController pozwala na udostępnienie interfejsów API Rest w wersji Spring 4.0 i nowszej.

 -2
Author: CoffeeBeanie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-09 02:44:21