Ответы:
@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вы можете вернуть представление в Spring Web 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был представлен весной 4х. Эта аннотация также аннотируется сама собой, @Controllerпоэтому, если она не работает как, @Controllerто сообщите об этом как об ошибке.
Interceptorс @RestController.
Interceptorк @RestController.
Как вы можете видеть в документации Spring ( Spring RestController Documentation ), аннотация Rest Controller аналогична аннотации Controller, но предполагается, что @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, и оно отправляется напрямую, а не отправляется из сервлет-диспетчера, и соответствующие преобразователи преобразуют ответ в связанном формате, таком как text / html, application / xml, application / json.Тем не менее, Restcontroller уже связан с ResponseBody и соответствующими конвертерами. Во-вторых, здесь, поскольку вместо преобразования элемента ответа он автоматически преобразуется в http-ответ.
@Controllerвозвращается View. @RestControllerвозвращается ResponseBody.
Аннотация @RestController была введена в Spring 4.0 для упрощения создания веб-сервисов RESTful. Это удобная аннотация, которая объединяет @Controller и @ResponseBody, что устраняет необходимость аннотировать каждый метод обработки запросов класса контроллера аннотацией @ResponseBody.
@ControllerЭта аннотация является специализированной версией @Componentи позволяет автоматически определять классы контроллера на основе сканирования пути к классам.@RestController: Эта аннотация представляет собой специализированную версию, @Controllerкоторая добавляет @Controllerи @ResponseBodyаннотацию автоматически, поэтому нам не нужно добавлять @ResponseBodyк нашим методам отображения.@Controller используется в устаревших системах, в которых используются JSP. это может вернуть взгляды. @RestController означает, что контроллер предоставляет службы REST с типом ответа JSON. поэтому он объединяет аннотации @Controller и @ResponseBody вместе.
Вместо использования @Controller и @ResponseBody, @RestController позволяет вам выставлять API-интерфейсы отдыха в Spring 4.0 и выше.