Risposte:
@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 { }
Thymeleafquesto, non funzionerà a @RestControllercausa di @ResponseBodyciò incluso in questa annotazione.
@ResponseBodyrende 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 @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.
@RestControllerle classi annotate sono le stesse @Controllerma @ResponseBodysono 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 @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.
@RestControllerfu introdotto in primavera 4x. Questa annotazione viene anche annotata da sola, @Controllerquindi se non funziona come un @Controllersegnalino come bug.
Interceptora a @RestController.
Interceptora @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:
@RequestMappingaccoppiato con @ResponseBodylike@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.
@Controllerritorna View. @RestControllerritorna 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 @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.@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.