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.
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@ResponseBody
adnotacji (patrz: Javadoc )
Więc poniższe dwie definicje kontrolera powinny zrobić to samo
@Controller
@ResponseBody
public class MyController { }
@RestController
public class MyRestController { }
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.
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.
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.
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.
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.
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.
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:
@RequestMapping
w połączeniu z@ResponseBody
Jak@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml") public @ResponseBody MyBean fetch(){ return new MyBean("hi") }
<mvc:annotation-driven/>
może być używany jako jeden ze sposobów używania JSON z Jacksonem lub xml.- MyBean można zdefiniować następująco
@XmlRootElement(name = "MyBean")
@XmlType(propOrder = {"field2", "field1"})
public class MyBean{
field1
field2 ..
//getter, setter
}
-
@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.
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.
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.
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
.
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.
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