Odpowiedzi:
@Controller
służy do oznaczania klas jako kontrolera Spring MVC.@RestController
to wygodna adnotacja, która nie robi nic więcej niż dodawanie adnotacji @Controller
i @ResponseBody
(patrz: Javadoc )Zatem dwie poniższe definicje kontrolera powinny zrobić to samo
@Controller
@ResponseBody
public class MyController { }
@RestController
public class MyRestController { }
Thymeleaf
ten nie będzie działał z @RestController
powodu tego @ResponseBody
zawartego w tej adnotacji.
@ResponseBody
sprawia, że zwrócone obiekty stają się czymś, co może znajdować się w ciele, np. JSON lub XML ( źródło )
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
}
}
@ResponseBody
jest włączona domyślnie. Nie musisz dodawać go powyżej podpisu funkcji.
Jeśli używasz @RestController
, nie możesz zwrócić widoku (używając Viewresolver
Spring / Springboot) i tak @ResponseBody
nie jest potrzebne w tym przypadku.
Jeśli używasz @Controller
, możesz zwrócić widok w Spring web MVC.
@RestController
adnotacją zajęcia są takie same jak @Controller
ale @ResponseBody
o metod obsługi są regulowane.
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 @Controller
kontrolerami 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.
@RestController
został wprowadzony wiosną 4x. Ta adnotacja również jest opatrzona adnotacją, @Controller
więc jeśli nie działa jak @Controller
wtedy, zgłoś to jako błąd.
Interceptor
z @RestController
.
Interceptor
do @RestController
.
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.
@RestController
był 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:
@RequestMapping
w połączeniu z @ResponseBody
podobnymi@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.
@XmlRootElement(name = "MyBean")
@XmlType(propOrder = {"field2", "field1"})
public class MyBean{
field1
field2 ..
//getter, setter
}
@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.
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.
@Controller
: Ta adnotacja jest tylko specjalistyczną wersją @Component
i umożliwia automatyczne wykrywanie klas kontrolerów na podstawie skanowania ścieżki klas.@RestController
: Ta adnotacja to specjalistyczna wersja, @Controller
która automatycznie dodaje @Controller
i @ResponseBody
adnotacje, więc nie musimy dodawać @ResponseBody
do naszych metod mapowania.@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.
Zamiast używać @Controller i @ResponseBody, @RestController pozwala Ci ujawnić API Rest w Spring 4.0 i nowszych wersjach.