Antworten:
@Controller wird verwendet, um Klassen als Spring MVC Controller zu markieren.@RestControllerist eine praktische Annotation, die nichts weiter tut als das Hinzufügen der Annotationen @Controllerund @ResponseBody(siehe: Javadoc )Die folgenden beiden Controller-Definitionen sollten also dasselbe tun
@Controller
@ResponseBody
public class MyController { }
@RestController
public class MyRestController { }
Thymeleafes wird nicht mit der Arbeit @RestControllerwegen @ResponseBodyder in dieser Anmerkung enthielt.
@ResponseBodymacht 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 @ResponseBodyist 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 Viewresolvervon Spring / Springboot), und @ResponseBodyin diesem Fall wird Ja nicht benötigt.
Wenn Sie verwenden @Controller, können Sie eine Ansicht in Spring Web MVC zurückgeben.
@RestControllerAnnotierte Klassen sind die gleichen wie, @Controlleraber die @ResponseBodyOn-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 @ControllerAnmerkungen 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.
@RestControllerwurde im Frühjahr 4x eingeführt. Diese Annotation wird auch selbst mit Annotationen versehen. @ControllerWenn sie nicht wie eine funktioniert, @Controllermelden Sie dies als Fehler.
Interceptormit einem verknüpfen @RestController.
Interceptoran 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.
@RestControllerwurde 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:
@RequestMappinggekoppelt mit @ResponseBodywie@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.
@Controllerkehrt zurück View. @RestControllerkehrt 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 @Componentund ermöglicht die automatische Erkennung der Controller-Klassen basierend auf dem Scannen von Klassenpfaden.@RestController: Diese Annotation ist eine spezielle Version, @Controllerdie automatisch hinzugefügt @Controllerund @ResponseBodykommentiert wird, sodass wir @ResponseBodyunsere 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.