Antworten:
@Controller
wird verwendet, um Klassen als Spring MVC Controller zu markieren.@RestController
ist eine praktische Annotation, die nichts weiter tut als das Hinzufügen der Annotationen @Controller
und @ResponseBody
(siehe: Javadoc )Die folgenden beiden Controller-Definitionen sollten also dasselbe tun
@Controller
@ResponseBody
public class MyController { }
@RestController
public class MyRestController { }
Thymeleaf
es wird nicht mit der Arbeit @RestController
wegen @ResponseBody
der in dieser Anmerkung enthielt.
@ResponseBody
macht die zurückgegebenen Objekte zu etwas, das im Körper sein könnte, zB JSON oder XML ( Quelle )
Im folgenden Code zeige ich Ihnen den Unterschied zwischen @controller
@Controller
public class RestClassName{
@RequestMapping(value={"/uri"})
@ResponseBody
public ObjectResponse functionRestName(){
//...
return instance
}
}
und @RestController
@RestController
public class RestClassName{
@RequestMapping(value={"/uri"})
public ObjectResponse functionRestName(){
//...
return instance
}
}
Das @ResponseBody
ist standardmäßig aktiviert. Sie müssen es nicht über der Funktionssignatur hinzufügen.
Wenn Sie verwenden @RestController
, können Sie keine Ansicht zurückgeben (mithilfe Viewresolver
von Spring / Springboot), und @ResponseBody
in diesem Fall wird Ja nicht benötigt.
Wenn Sie verwenden @Controller
, können Sie eine Ansicht in Spring Web MVC zurückgeben.
@RestController
Annotierte Klassen sind die gleichen wie, @Controller
aber die @ResponseBody
On-Handler-Methoden sind impliziert.
Seien Sie vorsichtig - sie sind nicht genau gleich.
Wenn Sie in Ihrer Anwendung Interceptors definieren, gelten diese nicht für mit Anmerkungen versehene Controller @RestController
, sie funktionieren jedoch mit mit @Controller
Anmerkungen versehenen Controllern.
dh. Konfiguration für den Interceptor:
@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TemplateMappingInterceptor()).addPathPatterns("/**", "/admin-functions**").excludePathPatterns("/login**");
}
}
und in der Deklaration eines Federreglers:
@Controller
public class AdminServiceController {...
Wird jedoch funktionieren
@RestController
public class AdminServiceController {...
endet nicht damit, dass der Abfangjäger damit verbunden ist.
@RestController
wurde im Frühjahr 4x eingeführt. Diese Annotation wird auch selbst mit Annotationen versehen. @Controller
Wenn sie nicht wie eine funktioniert, @Controller
melden Sie dies als Fehler.
Interceptor
mit einem verknüpfen @RestController
.
Interceptor
an eine angehängt @RestController
.
Wie Sie in der Spring-Dokumentation ( Spring RestController-Dokumentation ) sehen können, entspricht die Rest Controller-Annotation der Controller-Annotation, setzt jedoch voraus, dass @ResponseBody standardmäßig aktiv ist, sodass alle JSON-Dateien in Java-Objekte analysiert werden.
@RestController
wurde seit Frühjahr 4.0.1 zur Verfügung gestellt. Diese Controller geben an, dass hier @ RequestMapping-Methoden standardmäßig die @ ResponseBody-Semantik annehmen.
In früheren Versionen konnte die ähnliche Funktionalität erreicht werden, indem Folgendes verwendet wurde:
@RequestMapping
gekoppelt mit @ResponseBody
wie@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml")
public @ResponseBody MyBean fetch(){
return new MyBean("hi")
}
<mvc:annotation-driven/>
kann als eine der Möglichkeiten zur Verwendung von JSON mit Jackson oder XML verwendet werden.
@XmlRootElement(name = "MyBean")
@XmlType(propOrder = {"field2", "field1"})
public class MyBean{
field1
field2 ..
//getter, setter
}
@ResponseBody
wird hier unter MVC als Ansicht behandelt und direkt versendet, anstatt vom Dispatcher-Servlet versendet zu werden, und die jeweiligen Konverter konvertieren die Antwort in das zugehörige Format wie Text / HTML, Anwendung / XML, Anwendung / JSON.Der Restcontroller ist jedoch bereits mit ResponseBody und den jeweiligen Konvertern gekoppelt. Zweitens wird hier der Antwortkörper automatisch konvertiert, anstatt ihn zu konvertieren.
@Controller
kehrt zurück View
. @RestController
kehrt zurück ResponseBody
.
Die Annotation @RestController wurde im Frühjahr 4.0 eingeführt, um die Erstellung von RESTful-Webdiensten zu vereinfachen. Es handelt sich um eine praktische Annotation, die @Controller und @ResponseBody kombiniert. Dadurch entfällt die Notwendigkeit, jede Anforderungsbehandlungsmethode der Controller-Klasse mit der Annotation @ResponseBody zu kommentieren.
@Controller
: Diese Annotation ist nur eine spezielle Version von @Component
und ermöglicht die automatische Erkennung der Controller-Klassen basierend auf dem Scannen von Klassenpfaden.@RestController
: Diese Annotation ist eine spezielle Version, @Controller
die automatisch hinzugefügt @Controller
und @ResponseBody
kommentiert wird, sodass wir @ResponseBody
unsere Mapping-Methoden nicht ergänzen müssen.@Controller wird in Legacy-Systemen verwendet, die JSPs verwenden. Es kann Ansichten zurückgeben. @RestController markiert, dass der Controller REST-Services mit dem JSON-Antworttyp bereitstellt. Daher werden die Annotationen @Controller und @ResponseBody zusammengeführt.
Anstatt @Controller und @ResponseBody zu verwenden, können Sie mit @RestController Rest-APIs in Spring 4.0 und höher verfügbar machen.