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.

Srikanth
la source

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 { }
micha
la source
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.

BERGUIGA Mohamed Amine
la source
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.

Ravi Wadje
la source
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.

bertybro
la source
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.

CAAY
la source
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.

yancy
la source
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.

hi.nitish
la source
2

@Controllerretourne View. @RestControllerretourne ResponseBody.

G.Brown
la source
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.

Dwij Sheth
la source
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.
Prashant Goswami
la source
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.

Tharindu Eranga
la source
-3

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

sambhu
la source
-3

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

CoffeeBeanie
la source
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