web-dev-qa-db-fra.com

Différence entre les annotations spring @Controller et @RestController

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.

312
Srikanth
  • @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 { }
437
micha

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.

49

Les classes annotées @RestController sont identiques à @Controller mais les @ResponseBody sur les méthodes de gestion sont implicites.

18
Bart

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.

16
Ravi Wadje

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.

12
bertybro

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.

8
CAAY

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.

4
yancy

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

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

2
hi.nitish

@Controller renvoie View. @RestController renvoie ResponseBody.

0
G.Brown
  • @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.
0
Prashant Goswami