Différence entre les annotations printemps @Controller
et @RestController
.
Peut-on utiliser l'annotation @Controller
pour les applications Web MVC et REST?
Si oui, comment pouvons-nous différencier s'il s'agit de Web MVC ou de l'application REST.
@Controller
est utilisé pour marquer les classes en tant que contrôleur Spring MVC.@RestController
est une annotation pratique qui ne fait rien d’ajouter que l’ajout des annotations @Controller
et @ResponseBody
(voir: Javadoc ).Donc, les deux définitions de contrôleur suivantes devraient faire la même chose
@Controller
@ResponseBody
public class MyController { }
@RestController
public class MyRestController { }
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
}
}
le @ResponseBody
est activé par défaut. Vous n'avez pas besoin de l'ajouter au-dessus de la signature de la fonction.
Les classes annotées @RestController
sont identiques à @Controller
mais les @ResponseBody
sur les méthodes de gestion sont implicites.
Si vous utilisez @RestController
, vous ne pouvez pas retourner de vue (En utilisant Viewresolver
dans Spring/springboot) et yes @ResponseBody
n'est pas nécessaire dans ce cas.
Si vous utilisez @Controller
, vous pouvez retourner une vue dans Spring Web MVC.
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 en tant que @RestController
, mais ils fonctionnent avec les contrôleurs annotés @Controller
.
c'est à dire. configuration pour 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 {...
Travaillera, cependant
@RestController
public class AdminServiceController {...
ne finit pas par être associé à l'intercepteur.
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, tous les json sont analysés comme Java objets.
LA nouvelle annotation @RestController dans Spring4 +, qui marque la classe en tant que contrôleur où chaque méthode renvoie un objet de domaine au lieu d'une vue. L’abréviation de @Controller et de @ResponseBody est combinée.
@RestController
est 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 pourrait ê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'un des moyens 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 par MVC. Il est directement envoyé à partir de Dispatcher Servlet et les convertisseurs respectifs convertissent la réponse au format associé, tel que text/html, application/xml, application/json.Cependant, Restcontroller est déjà associé à ResponseBody et aux convertisseurs correspondants. Deuxièmement, ici, car au lieu de convertir le corps de réponse, celui-ci est automatiquement converti en réponse http.
@Controller
renvoie View
. @RestController
renvoie ResponseBody
.
@Controller
: cette annotation n'est qu'une version spécialisée de @Component
et permet la détection automatique des classes de contrôleur en fonction de l'analyse du chemin d'accès aux classes.@RestController
: cette annotation est une version spécialisée de @Controller
qui ajoute automatiquement les annotations @Controller
et @ResponseBody
, de sorte que nous n'avons pas à ajouter @ResponseBody
à nos méthodes de mappage.