Differenza tra l'annotazione @Controller della molla e l'annotazione @RestController


357

Differenza tra primavera @Controllere @RestControllerannotazione.

È possibile @Controllerutilizzare l'annotazione per entrambe le applicazioni Web MVC e REST?
Se sì, come possiamo differenziare se si tratta di un'applicazione Web MVC o REST.

Risposte:


471
  • @Controller viene utilizzato per contrassegnare le classi come controller Spring MVC.
  • @RestControllerè un'annotazione pratica che non fa altro che aggiungere le annotazioni @Controllere @ResponseBody(vedi: Javadoc )

Quindi le seguenti due definizioni di controller dovrebbero fare lo stesso

@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }


48
Penso che @RestController converta automaticamente anche la risposta in JSON / XML.
arnabkaycee,


9
Inoltre, se usi un motore modello come Thymeleafquesto, non funzionerà a @RestControllercausa di @ResponseBodyciò incluso in questa annotazione.
Sonique,

3
@ResponseBodyrende gli oggetti restituiti a qualcosa che potrebbe essere nel corpo, ad esempio JSON o XML ( fonte )
Martin Thoma,

59

Nel codice qui sotto ti mostrerò la differenza tra @controller

@Controller
public class RestClassName{

  @RequestMapping(value={"/uri"})
  @ResponseBody
  public ObjectResponse functionRestName(){
      //...
      return instance
   }
}

e @RestController

@RestController
public class RestClassName{

  @RequestMapping(value={"/uri"})
  public ObjectResponse functionRestName(){
      //...
      return instance
   }
}

la @ResponseBodyè attivata di default. Non è necessario aggiungerlo sopra la firma della funzione.


1
I nomi delle classi in Java devono iniziare in maiuscolo, ovvero RestClassName (non restClassName).
Razzle

24

Se si utilizza @RestControllernon è possibile restituire una vista (utilizzando Viewresolverin Spring / springboot) e @ResponseBodyin questo caso non è necessario.

Se lo usi @Controllerpuoi restituire una vista in Spring web MVC.


Sì, @ResponseBody può essere impostato su un metodo e indica che il tipo restituito deve essere scritto direttamente sul corpo della risposta HTTP (e non inserito in un modello, o interpretato come un nome di visualizzazione)
PraveenKumar Lalasangi


14

In realtà, fai attenzione: non sono esattamente gli stessi.

Se si definiscono intercettori all'interno dell'applicazione, questi non si applicheranno ai controller annotati come @RestController, tuttavia funzionano con i @Controllercontroller annotati.

vale a dire. configurazione per l'interceptor:

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TemplateMappingInterceptor()).addPathPatterns("/**", "/admin-functions**").excludePathPatterns("/login**");
    }

}

e nella dichiarazione di un controllore a molla:

@Controller
public class AdminServiceController {...

Funzionerà, tuttavia

@RestController
public class AdminServiceController {...

non finisce per avere l'intercettore ad esso associato.


2
@RestControllerfu introdotto in primavera 4x. Questa annotazione viene anche annotata da sola, @Controllerquindi se non funziona come un @Controllersegnalino come bug.
gaoagong,

@bertybro, non è del tutto esatto. È possibile associare Interceptora a @RestController.
Ravi-A-Doer,

Ho sicuramente attaccato con successo un Interceptora @RestController.
Ben Barden,

11

Come puoi vedere nella documentazione di Spring ( Documentazione di RestController Spring ) L'annotazione del controller di riposo è uguale all'annotazione del controller, ma supponendo che @ResponseBody sia attivo per impostazione predefinita, quindi tutto il json viene analizzato negli oggetti Java.


4

LA nuova annotazione @RestController in Spring4 +, che segna la classe come controller in cui ogni metodo restituisce un oggetto dominio anziché una vista. È una scorciatoia per @Controller e @ResponseBody messi insieme.


3

@RestControllerè stato fornito dalla primavera 4.0.1. Questi controller indicano che qui i metodi @RequestMapping assumono la semantica @ResponseBody per impostazione predefinita.

Nelle versioni precedenti la funzionalità simile poteva essere raggiunta usando di seguito:

  1. @RequestMappingaccoppiato con @ResponseBodylike@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml") public @ResponseBody MyBean fetch(){ return new MyBean("hi") }

  2. <mvc:annotation-driven/> può essere utilizzato come uno dei modi per utilizzare JSON con Jackson o xml.

  3. MyBean può essere definito come

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

  1. @ResponseBody viene considerato come la vista qui tra MVC e viene inviato direttamente invece di essere inviato dal Servlet Dispatcher e i rispettivi convertitori convertono la risposta nel formato correlato come text / html, application / xml, application / json.

Tuttavia, Restcontroller è già associato a ResponseBody e ai rispettivi convertitori. In secondo luogo, qui, poiché invece di convertire il responsebody, viene automaticamente convertito in risposta http.


2

@Controllerritorna View. @RestControllerritorna ResponseBody.


2
Dovresti spiegare di più. Come sta rispondendo alla domanda?
Yunnosch,

@Yunnosch 'view' è il tuo front-end come jsp o html. ResponseBody può essere xml, json, yaml
G.Brown

Si prega di modificare la risposta di aggiungere informazioni utili. Tuttavia non riesco ancora a capire come dovrebbe rispondere alla domanda. Potresti pronunciare una spiegazione del tipo "Sì, puoi / No, non puoi, perché ...."?
Yunnosch,

1

L'annotazione @RestController è stata introdotta nella primavera 4.0 per semplificare la creazione di servizi Web RESTful. È un'annotazione pratica che combina @Controller e @ResponseBody - che elimina la necessità di annotare ogni metodo di gestione delle richieste della classe controller con l'annotazione @ResponseBody.


0
  • @Controller: Questa annotazione è solo una versione specializzata di @Componente consente di rilevare automaticamente le classi del controller in base alla scansione del percorso di classe.
  • @RestController: Questa annotazione è una versione specializzata della @Controllerquale si aggiunge @Controllere @ResponseBodyannotazione automaticamente, quindi non è necessario aggiungere @ResponseBodyai nostri metodi di mappatura.

0

@Controller viene utilizzato nei sistemi legacy che utilizzano JSP. può restituire visualizzazioni. @RestController indica che il controller sta fornendo servizi REST con tipo di risposta JSON. quindi racchiude insieme le annotazioni @Controller e @ResponseBody.


-3

@RestControllerè la composizione di @Controllere @ResponseBody, se non stiamo usando la @ResponseBodyfirma in Method, allora dobbiamo usare @Restcontroller.


-3

Invece di utilizzare @Controller e @ResponseBody, @RestController ti consente di esporre le API Rest nella primavera 4.0 e successive.


Vuoi dire che penso che @RestController converta automaticamente anche la risposta in JSON / XML. ? hai usato una frase astratta invece di spiegarla chiaramente, non lo suggerirò.
cinqS

Pensaci, @Controller fa lo stesso che produce e consuma tipi MIME JSON / XML o in altro modo ... @ ResponseBody dice a Controller di comportarsi come endpoint REST senza produrre una vista. RestController lo fa implicitamente.
CoffeeBeanie
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.