Différence entre l'annotation Spring @Controller et @RestController


357

Différence entre ressort @Controlleret @RestControllerannotation.

L' @Controllerannotation peut-elle être utilisée 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.

Réponses:


471
  • @Controller est utilisé pour marquer les classes comme Spring MVC Controller.
  • @RestControllerest une annotation pratique qui ne fait rien de plus que l'ajout des annotations @Controlleret @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 { }


48
Je pense que @RestController convertit également la réponse en JSON / XML automatiquement.
arnabkaycee

1
Partage juste d'un lien vers un tutoriel Spring expliquant la différence spring.io/guides/gs/rest-service
Mina Samy

9
De plus, si vous utilisez un moteur de modèle comme Thymeleafcelui-ci, il ne fonctionnera pas à @RestControllercause de @ResponseBodycelui inclus dans cette annotation.
Sonique

3
@ResponseBodyrend les objets retournés à quelque chose qui pourrait être dans le corps, par exemple JSON ou XML ( source )
Martin Thoma

59

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' @ResponseBodyest activé par défaut. Vous n'avez pas besoin de l'ajouter au-dessus de la signature de fonction.


1
Les noms de classe en Java doivent commencer en majuscule, c'est-à-dire RestClassName (pas restClassName).
Razzle

24

Si vous utilisez, @RestControllervous ne pouvez pas retourner une vue (en utilisant Viewresolverdans Spring / springboot) et oui @ResponseBodyn'est pas nécessaire dans ce cas.

Si vous utilisez, @Controllervous pouvez renvoyer une vue dans Spring Web MVC.


Oui, @ResponseBody peut être mis sur une méthode et indique que le type de retour doit être écrit directement dans le corps de la réponse HTTP (et non placé dans un modèle, ou interprété comme un nom de vue)
PraveenKumar Lalasangi


14

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 @Controllercontrô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.


2
@RestControllera été introduit au printemps 4x. Cette annotation est également annotée par elle- @Controllermême si elle ne fonctionne pas comme une @Controlleralors signalez-la comme un bogue.
gaoagong

@bertybro, ce n'est pas tout à fait ça. Vous pouvez associer un Interceptorà un @RestController.
Ravi-A-Doer

J'ai certainement réussi à joindre un Interceptorà un @RestController.
Ben Barden

11

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.


4

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 regroupés.


3

@RestControllera é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:

  1. @RequestMappingcouplé avec @ResponseBodycomme@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml") public @ResponseBody MyBean fetch(){ return new MyBean("hi") }

  2. <mvc:annotation-driven/> peut être utilisé comme l'une des façons d'utiliser JSON avec Jackson ou xml.

  3. MyBean peut être défini comme

@XmlRootElement(name = "MyBean") @XmlType(propOrder = {"field2", "field1"}) public class MyBean{ field1 field2 .. //getter, setter }

  1. @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.


2

@Controllerretourne View. @RestControllerretourne ResponseBody.


2
Vous devriez expliquer plus. Comment cela répond-il à la question?
Yunnosch

@Yunnosch 'view' est votre frontal comme jsp ou html. ResponseBody peut être xml, json, yaml
G.Brown

Veuillez modifier votre réponse pour ajouter des informations utiles. Cependant, je ne comprends toujours pas comment il devrait répondre à la question. Pourriez-vous formuler une explication comme "Oui, vous pouvez / Non, vous ne pouvez pas, parce que ..."?
Yunnosch

1

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.


0
  • @Controller: Cette annotation est juste une version spécialisée de @Componentet 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 @Controllerqui ajoute @Controlleret @ResponseBodyannote automatiquement afin que nous n'ayons pas à ajouter @ResponseBodyà nos méthodes de mappage.

0

@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.


-3

@RestControllerest la composition de @Controlleret @ResponseBody, si nous n'utilisons pas la @ResponseBodysignature in Method, nous devons utiliser le @Restcontroller.


-3

Au lieu d'utiliser @Controller et @ResponseBody, @RestController vous permet d'exposer les API Rest dans Spring 4.0 et supérieur.


Vous voulez dire que je pense que @RestController convertit également la réponse en JSON / XML automatiquement. ? vous avez utilisé une phrase abstraite au lieu de l'expliquer clairement, je ne le suggérerai pas.
cinqS

À bien y penser, @Controller fait la même chose qu'il prend et produit des types MIME JSON / XML ou autre ... @ ResponseBody dit au contrôleur de se comporter comme un point de terminaison REST sans produire de vue. RestController le fait implicitement.
CoffeeBeanie
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.