Разница между комментариями spring @Controller и @RestController
Разница между аннотациями spring @Controller
и @RestController
.
Может ли аннотация @Controller
использоваться как для приложений Web MVC, так и для REST?
Если да, то как мы можем дифференцироваться, если это приложение Web MVC или REST.
Ответы
Ответ 1
-
@Controller
используется для обозначения классов как Spring MVC Controller.
-
@RestController
- удобная аннотация, которая делает не что иное, как добавление аннотаций @Controller
и @ResponseBody
(см. Javadoc)
Итак, следующие два определения контроллера должны делать то же самое
@Controller
@ResponseBody
public class MyController { }
@RestController
public class MyRestController { }
Ответ 2
В приведенном ниже коде я покажу вам разницу между @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
активирован по умолчанию. Вам не нужно добавлять его над сигнатурой функции.
Ответ 3
@RestController
аннотированные классы совпадают с @Controller
, но подразумеваются @ResponseBody
в методах обработчика.
Ответ 4
Если вы используете @RestController
вы не сможете вернуть представление (с помощью Viewresolver
в Spring/@ResponseBody
), и да @ResponseBody
в этом случае не требуется.
Если вы используете @Controller
вы можете вернуть представление в Spring web MVC.
Ответ 5
Собственно, будьте осторожны - они не совсем то же самое.
Если вы определяете какие-либо перехватчики в своем приложении, они не будут применяться к контроллерам, аннотированным как @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 {...
не заканчивается тем, что связанный с ним перехватчик.
Ответ 6
Как вы можете видеть в документации Spring (Spring Документация RestController) Аннотации Rest Controller совпадают с аннотацией Controller, но при условии, что @ResponseBody активен по умолчанию, поэтому все json обрабатываются java-объектами.
Ответ 7
Новая аннотация @RestController в Spring4 +, которая отмечает класс как контроллер, где каждый метод возвращает объект домена вместо представления. Его сокращение для @Controller и @ResponseBody свернуто вместе.
Ответ 8
@RestController
был предоставлен с Spring 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 с Jackson или xml.
- MyBean можно определить как
@XmlRootElement(name = "MyBean")
@XmlType(propOrder = {"field2", "field1"})
public class MyBean{
field1
field2 ..
//getter, setter
}
-
@ResponseBody
рассматривается как вид здесь среди MVC и отправляется напрямую, а отправляется из диспетчера Servlet, а соответствующие конвертеры преобразуют ответ в соответствующем формате, например text/html, application/xml, application/json.
Однако, Restcontroller уже связан с ResponseBody и соответствующими преобразователями. Во-вторых, здесь, поскольку вместо преобразования тела ответа он автоматически преобразуется в ответ HTTP.
Ответ 9
-
@Controller
: эта аннотация является просто специализированной версией @Component
и позволяет автоматически определять классы контроллера на основе сканирования пути к классам. -
@RestController
: эта аннотация является специализированной версией @Controller
которая @Controller
@ResponseBody
аннотации @Controller
и @ResponseBody
поэтому нам не нужно добавлять @ResponseBody
в наши методы отображения.
Ответ 10
@Controller
против RestController
@RestController
:
![enter image description here]()
- Эта аннотация является специализированной версией
@Controller
которая @Controller
@ResponseBody
аннотации @Controller
и @ResponseBody
. поэтому нам не нужно добавлять @ResponseBody
в наши методы отображения. Это означает, что @ResponseBody
по умолчанию активен. - Если вы используете
@RestController
вы не сможете вернуть представление (с помощью Viewresolver
в Spring/Spring-Boot) -
@RestController
также @RestController
преобразует ответ в JSON/XML automatically
поскольку @ResponseBody
превращает возвращаемые объекты во что-то, что может находиться в теле, eg JSON or XML
@Controller
![enter image description here]()
-
@Controller
используется для обозначения классов как Spring MVC Controller. Эта аннотация является специализированной версией @Component
и позволяет автоматически определять классы контроллера на основе сканирования пути к классам. -
@Controller
вы можете вернуть представление в Spring Web MVC.
Более подробный вид
Ответ 11
@Controller
возвращает View
. @RestController
возвращает ResponseBody
.
Ответ 12
@RestController
представляет собой состав @Controller
и @ResponseBody
, если мы не используем @ResponseBody
в сигнатуре метода, тогда нам нужно использовать @RestController
.
Ответ 13
Вместо использования @Controller и @ResponseBody, @RestController позволяет вам открывать API-интерфейс Rest в Spring 4.0 и выше.