Відповіді:
@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
ви не можете повернути представлення даних (за допомогою Viewresolver
Spring / 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 та вище.