Відповіді:
@Controller використовується для позначення класів як Spring MVC Controller.@RestControllerце примітка про зручність, яка не означає нічого, крім додавання @Controllerта @ResponseBodyприміток (див.: Javadoc )Отже наступні два визначення контролера повинні робити те саме
@Controller
@ResponseBody
public class MyController { }
@RestController
public class MyRestController { }
Thymeleafвін не працюватиме з- @RestControllerза того, @ResponseBodyщо включено до цієї анотації.
@ResponseBodyробить об’єкти, що повертаються, до чогось, що може бути в тілі, наприклад, JSON або XML ( джерело )
У наведеному нижче коді я покажу вам різницю між @controller
@Controller
public class RestClassName{
@RequestMapping(value={"/uri"})
@ResponseBody
public ObjectResponse functionRestName(){
//...
return instance
}
}
і @RestController
@RestController
public class RestClassName{
@RequestMapping(value={"/uri"})
public ObjectResponse functionRestName(){
//...
return instance
}
}
@ResponseBodyактивується за умовчанням. Не потрібно додавати його над підписом функції.
Якщо ви користуєтесь, @RestControllerви не можете повернути представлення даних (за допомогою ViewresolverSpring / Springboot), і так @ResponseBodyу цьому випадку не потрібно.
Якщо ви користуєтесь, @Controllerви можете повернути представлення даних у Весняний веб-MVC.
@RestControllerанотовані класи такі самі, як @Controllerі @ResponseBodyметоди обробника, маються на увазі.
Власне, будьте обережні - вони не зовсім однакові.
Якщо ви визначите будь-які перехоплювачі у вашій програмі, вони не застосовуватимуться до контролерів, зазначених як @RestController, але вони працюють з@Controller контрольованими контролерами.
тобто. конфігурація для перехоплювача:
@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TemplateMappingInterceptor()).addPathPatterns("/**", "/admin-functions**").excludePathPatterns("/login**");
}
}
і в декларації регулятора Spring:
@Controller
public class AdminServiceController {...
Працюватиме, проте
@RestController
public class AdminServiceController {...
не закінчується тим, що перехоплювач асоціюється з ним.
@RestControllerбула представлена навесні 4x. Ця анотація також позначається самим собою, @Controllerякщо вона не працює як @Controllerтоді, повідомте про це як про помилку.
Interceptorа @RestController.
Interceptorдо @RestController.
Як ви можете бачити у весняній документації ( Документація Spring RestController ) Анотація решти контролера така ж, як анотація контролера, але припускаючи, що @ResponseBody за замовчуванням активний, тому всі json розбираються на об'єкти Java.
@RestControllerнадається з весни 4.0.1. Ці контролери вказують, що тут @RequestMapping методи за замовчуванням передбачають семантику @ResponseBody.
У попередніх версіях подібного функціоналу можна досягти, використовуючи нижче:
@RequestMappingв поєднанні з @ResponseBodyподібними@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml")
public @ResponseBody MyBean fetch(){
return new MyBean("hi")
}
<mvc:annotation-driven/> може бути використаний як один із способів використання JSON з Джексоном або xml.
@XmlRootElement(name = "MyBean")
@XmlType(propOrder = {"field2", "field1"})
public class MyBean{
field1
field2 ..
//getter, setter
}
@ResponseBody тут розглядається як вигляд серед MVC, і він надсилається безпосередньо, а не відправляється з диспетчерського сервлета, а відповідні перетворювачі перетворюють відповідь у відповідний формат, як текст / html, application / xml, application / json.Однак Restcontroller вже поєднаний з ResponseBody та відповідними перетворювачами. По-друге, тут, оскільки замість перетворення відповіді, воно автоматично перетворюється на http-відповідь.
@Controller: Ця анотація є лише спеціалізованою версією, @Componentі вона дозволяє автоматично виявляти класи контролерів на основі сканування класного шляху.@RestController: Ця анотація є спеціалізованою версією, @Controllerяка додає @Controllerта @ResponseBodyкоментує автоматично, тому нам не доведеться додавати @ResponseBodyдо наших методів відображення.@Controller використовується в застарілих системах, які використовують JSP. він може повертати перегляди. @RestController означає, що контролер надає послуги REST з типом відповіді JSON. тож він поєднує анотації @Controller та @ResponseBody разом.
Замість використання @Controller та @ResponseBody, @RestController давайте викрийте API відпочинку у весному 4.0 та вище.