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.

269
demandé sur naXa 2014-08-11 15:34:10

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 { }
382
répondu micha 2014-08-11 15:18:51

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.

41
répondu BERGUIGA Mohamed Amine 2018-08-23 08:00:56

@RestController annoté classes sont les mêmes que @Controller, mais le @ResponseBody sur les méthodes de gestionnaire sont implicites.

17
répondu Bart 2014-08-11 11:41:13

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.

12
répondu bertybro 2015-02-04 04:42:22

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.

8
répondu CAAY 2014-08-11 11:41:56

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.

8
répondu Ravi Wadje 2017-06-27 11:54:05

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.

4
répondu yancy 2017-01-18 08:59:06

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

  1. @RequestMapping couplé avec @ResponseBody comme @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'un des moyens 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 à 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.

2
répondu hi.nitish 2017-06-16 11:21:08
  • @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.
0
répondu Prashant Goswami 2018-08-23 10:19:54

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.

0
répondu Vajahat Ali 2018-09-27 08:35:52

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

-2
répondu sambhu 2016-11-02 16:27:30

Au lieu d'utiliser @Controller et @ResponseBody, @RestController vous permet d'exposer les API Rest au printemps 4.0 et au-dessus.

-2
répondu CoffeeBeanie 2017-03-09 02:44:21