Réponses:
@Controller
est utilisé pour marquer les classes comme Spring MVC Controller.@RestController
est une annotation pratique qui ne fait rien de plus que l'ajout des annotations @Controller
et @ResponseBody
(voir: Javadoc )Ainsi, les deux définitions de contrôleur suivantes devraient faire de même
@Controller
@ResponseBody
public class MyController { }
@RestController
public class MyRestController { }
Thymeleaf
celui-ci, il ne fonctionnera pas à @RestController
cause de @ResponseBody
celui inclus dans cette annotation.
@ResponseBody
rend les objets retournés à quelque chose qui pourrait être dans le corps, par exemple JSON ou XML ( source )
Dans le code ci-dessous, je vais vous montrer la différence entre @controller
@Controller
public class RestClassName{
@RequestMapping(value={"/uri"})
@ResponseBody
public ObjectResponse functionRestName(){
//...
return instance
}
}
et @RestController
@RestController
public class RestClassName{
@RequestMapping(value={"/uri"})
public ObjectResponse functionRestName(){
//...
return instance
}
}
l' @ResponseBody
est activé par défaut. Vous n'avez pas besoin de l'ajouter au-dessus de la signature de fonction.
Si vous utilisez, @RestController
vous ne pouvez pas retourner une vue (en utilisant Viewresolver
dans Spring / springboot) et oui @ResponseBody
n'est pas nécessaire dans ce cas.
Si vous utilisez, @Controller
vous pouvez renvoyer une vue dans Spring Web MVC.
@RestController
les classes annotées sont les mêmes que @Controller
mais les @ResponseBody
méthodes on sur le gestionnaire sont implicites.
En fait, soyez prudent - ils ne sont pas exactement les mêmes.
Si vous définissez des intercepteurs dans votre application, ils ne s'appliqueront pas aux contrôleurs annotés car @RestController
, cependant, ils fonctionnent avec les @Controller
contrôleurs annotés.
c'est à dire. configuration de l'intercepteur:
@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TemplateMappingInterceptor()).addPathPatterns("/**", "/admin-functions**").excludePathPatterns("/login**");
}
}
et dans la déclaration d'un contrôleur Spring:
@Controller
public class AdminServiceController {...
Fonctionnera cependant
@RestController
public class AdminServiceController {...
ne finit pas par être associé à l'intercepteur.
@RestController
a été introduit au printemps 4x. Cette annotation est également annotée par elle- @Controller
même si elle ne fonctionne pas comme une @Controller
alors signalez-la comme un bogue.
Interceptor
à un @RestController
.
Interceptor
à un @RestController
.
Comme vous pouvez le voir dans la documentation Spring (Documentation Spring RestController ) L'annotation Rest Controller est identique à l'annotation Controller, mais en supposant que @ResponseBody est actif par défaut, donc tous les json sont analysés en objets java.
@RestController
a été fourni depuis le printemps 4.0.1. Ces contrôleurs indiquent qu'ici les méthodes @RequestMapping supposent la sémantique @ResponseBody par défaut.
Dans les versions antérieures, la fonctionnalité similaire pouvait être obtenue en utilisant ci-dessous:
@RequestMapping
couplé avec @ResponseBody
comme@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml")
public @ResponseBody MyBean fetch(){
return new MyBean("hi")
}
<mvc:annotation-driven/>
peut être utilisé comme l'une des façons d'utiliser JSON avec Jackson ou xml.
@XmlRootElement(name = "MyBean")
@XmlType(propOrder = {"field2", "field1"})
public class MyBean{
field1
field2 ..
//getter, setter
}
@ResponseBody
est traité comme la vue ici parmi MVC et il est distribué directement au lieu d'être distribué à partir de Dispatcher Servlet et les convertisseurs respectifs convertissent la réponse dans le format associé comme texte / html, application / xml, application / json.Cependant, le Restcontroller est déjà couplé avec ResponseBody et les convertisseurs respectifs. Deuxièmement, ici, car au lieu de convertir le corps de réponse, il est automatiquement converti en réponse http.
L'annotation @RestController a été introduite au printemps 4.0 pour simplifier la création de services Web RESTful. Il s'agit d'une annotation pratique qui combine @Controller et @ResponseBody - ce qui élimine le besoin d'annoter chaque méthode de traitement des demandes de la classe contrôleur avec l'annotation @ResponseBody.
@Controller
: Cette annotation est juste une version spécialisée de @Component
et elle permet aux classes de contrôleur d'être détectées automatiquement en fonction de l'analyse du chemin de classe.@RestController
: Cette annotation est une version spécialisée @Controller
qui ajoute @Controller
et @ResponseBody
annote automatiquement afin que nous n'ayons pas à ajouter @ResponseBody
à nos méthodes de mappage.@Controller est utilisé dans les systèmes hérités qui utilisent des JSP. il peut renvoyer des vues. @RestController consiste à marquer que le contrôleur fournit des services REST avec le type de réponse JSON. il encapsule donc les annotations @Controller et @ResponseBody ensemble.
Au lieu d'utiliser @Controller et @ResponseBody, @RestController vous permet d'exposer les API Rest dans Spring 4.0 et supérieur.