Risposte:
@Controller
viene utilizzato per contrassegnare le classi come controller Spring MVC.@RestController
è un'annotazione pratica che non fa altro che aggiungere le annotazioni @Controller
e @ResponseBody
(vedi: Javadoc )Quindi le seguenti due definizioni di controller dovrebbero fare lo stesso
@Controller
@ResponseBody
public class MyController { }
@RestController
public class MyRestController { }
Thymeleaf
questo, non funzionerà a @RestController
causa di @ResponseBody
ciò incluso in questa annotazione.
@ResponseBody
rende gli oggetti restituiti a qualcosa che potrebbe essere nel corpo, ad esempio JSON o XML ( fonte )
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.
Se si utilizza @RestController
non è possibile restituire una vista (utilizzando Viewresolver
in Spring / springboot) e @ResponseBody
in questo caso non è necessario.
Se lo usi @Controller
puoi restituire una vista in Spring web MVC.
@RestController
le classi annotate sono le stesse @Controller
ma @ResponseBody
sono implicati i metodi on del gestore.
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 @Controller
controller 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.
@RestController
fu introdotto in primavera 4x. Questa annotazione viene anche annotata da sola, @Controller
quindi se non funziona come un @Controller
segnalino come bug.
Interceptor
a a @RestController
.
Interceptor
a @RestController
.
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.
@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:
@RequestMapping
accoppiato con @ResponseBody
like@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml")
public @ResponseBody MyBean fetch(){
return new MyBean("hi")
}
<mvc:annotation-driven/>
può essere utilizzato come uno dei modi per utilizzare JSON con Jackson o xml.
@XmlRootElement(name = "MyBean")
@XmlType(propOrder = {"field2", "field1"})
public class MyBean{
field1
field2 ..
//getter, setter
}
@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.
@Controller
ritorna View
. @RestController
ritorna ResponseBody
.
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.
@Controller
: Questa annotazione è solo una versione specializzata di @Component
e consente di rilevare automaticamente le classi del controller in base alla scansione del percorso di classe.@RestController
: Questa annotazione è una versione specializzata della @Controller
quale si aggiunge @Controller
e @ResponseBody
annotazione automaticamente, quindi non è necessario aggiungere @ResponseBody
ai nostri metodi di mappatura.@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.
Invece di utilizzare @Controller e @ResponseBody, @RestController ti consente di esporre le API Rest nella primavera 4.0 e successive.