Ответы:
@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
вы можете вернуть представление в 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 и выше.