Odpowiedzi:
@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 { }
Thymeleaften nie będzie działał z @RestControllerpowodu tego @ResponseBodyzawartego w tej adnotacji.
@ResponseBodysprawia, ż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
}
}
@ResponseBodyjest 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 ViewresolverSpring / Springboot) i tak @ResponseBodynie jest potrzebne w tym przypadku.
Jeśli używasz @Controller, możesz zwrócić widok w Spring web MVC.
@RestControlleradnotacją zajęcia są takie same jak @Controllerale @ResponseBodyo 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 @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.
@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.
Interceptorz @RestController.
Interceptordo @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.
@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:
@RequestMappingw połączeniu z @ResponseBodypodobnymi@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ą @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.@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.