Différence entre l'annotation spring @Controller et @RestController
Différence entre le printemps @Controller
et @RestController
annotation.
L'annotation @Controller
peut-elle être utilisée à la fois pour les applications Web MVC et REST?
Si oui, comment pouvons-nous différencier s'il s'agit D'une application web MVC ou REST.
12 réponses
-
@Controller
est utilisé pour marquer les classes en tant que contrôleur Spring MVC. -
@RestController
est une annotation de commodité qui ne fait rien de plus que d'ajouter les 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.
@RestController
annoté classes sont les mêmes que @Controller
, mais le @ResponseBody
sur les méthodes de 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 comme @RestController
, mais ils fonctionnent avec @Controller
contrôleurs annotés.
Ie. 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 de ressort:
@Controller
public class AdminServiceController {...
Fonctionnera, cependant
@RestController
public class AdminServiceController {...
Ne finit pas par associer l'intercepteur à celui-ci.
Comme vous pouvez le voir dans la documentation Spring (Spring RestController Documentation ) l'annotation du contrôleur Rest est la même que L'annotation du contrôleur, mais en supposant que @ResponseBody est actif par défaut, donc tous les json sont analysés en objets java.
Si vous utilisez @RestController, vous ne pouvez pas renvoyer une 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 webMVC.
La nouvelle annotation @ RestController dans Spring4+, qui marque la classe comme un contrôleur où chaque méthode renvoie un objet de domaine au lieu d'une vue. C'est un raccourci pour @Controller et @ResponseBody roulés ensemble.
@RestController
a été fourni depuis le printemps 4.0.1. ces contrôleurs indiquent qu'ici les méthodes @RequestMapping assument 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'un des moyens d'utiliser JSON avec Jackson ou xml.- MyBean peut être défini comme
@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 à la place d'être distribué à partir du servlet Dispatcher et les convertisseurs respectifs convertissent la réponse dans le format connexe comme text / 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 responsebody, il est automatiquement converti en réponse http.
-
@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 classpath. -
@RestController
: Cette annotation est une version spécialisée de@Controller
, qui ajoute@Controller
et@ResponseBody
annotation automatiquement, donc nous n'avons pas d'ajouter@ResponseBody
à nos méthodes de cartographie.
La classe est marquée comme @RestController
, ce qui signifie qu'elle est prête à être utilisée par Spring MVC pour gérer les requêtes web.@RequestMapping
mappe / à la méthode index()
. Lorsqu'elle est appelée à partir d'un navigateur ou à l'aide de curl sur la ligne de commande, la méthode renvoie du texte pur. En effet, @RestController
combine @Controller
et @ResponseBody
, deux annotations qui entraînent des requêtes web renvoyant des données plutôt qu'une vue.
@RestController
est la composition de @Controller
et @ResponseBody
, si nous n'utilisons pas le @ResponseBody
dans la signature de la méthode, nous devons utiliser le @Restcontroller
.
Au lieu d'utiliser @Controller et @ResponseBody, @RestController vous permet d'exposer les API Rest au printemps 4.0 et au-dessus.