Unterschied zwischen der Beschriftung spring @Controller
und @RestController
.
Kann die Annotation @Controller
sowohl für Web MVC- als auch für REST -Anwendungen verwendet werden?
Wenn ja, wie können wir unterscheiden, ob es sich um eine Web-MVC- oder eine REST -Anwendung handelt?.
@Controller
wird verwendet, um Klassen als Spring MVC Controller zu markieren.@RestController
ist eine Annotation, die nichts weiter tut, als die Annotationen @Controller
und @ResponseBody
hinzuzufügen (siehe: Javadoc )Daher sollten die folgenden beiden Controller-Definitionen dasselbe tun
@Controller
@ResponseBody
public class MyController { }
@RestController
public class MyRestController { }
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
}
}
der @ResponseBody
ist standardmäßig aktiviert. Sie müssen es nicht über der Funktionssignatur hinzufügen.
@RestController
mit Annotationen versehene Klassen sind die gleichen wie @Controller
, aber die @ResponseBody
in den Handlermethoden sind impliziert.
Wenn Sie @RestController
verwenden, können Sie keine Ansicht zurückgeben (indem Sie Viewresolver
in Spring/Springboot verwenden), und in diesem Fall wird @ResponseBody
nicht benötigt.
Wenn Sie @Controller
verwenden, können Sie eine Ansicht in Spring Web MVC zurückgeben.
Seien Sie vorsichtig - sie sind nicht genau gleich.
Wenn Sie in Ihrer Anwendung Interceptors definieren, gelten diese nicht für Controller, die mit @RestController
gekennzeichnet sind, sie funktionieren jedoch mit mit @Controller
gekennzeichneten 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 Spring Controllers:
@Controller
public class AdminServiceController {...
Wird aber funktionieren
@RestController
public class AdminServiceController {...
endet nicht damit, dass der Abfangjäger damit verbunden ist.
Wie Sie in der Spring-Dokumentation sehen können ( Spring RestController Documentation ), entspricht die Rest-Controller-Annotation der Controller-Annotation, setzt jedoch voraus, dass @ResponseBody standardmäßig aktiv ist, sodass alle json-Werte nach Java Objekte.
Die neue @ RestController-Annotation in Spring4 +, die die Klasse als Controller kennzeichnet, bei der jede Methode ein Domänenobjekt anstelle einer Ansicht zurückgibt. Es ist die Abkürzung für "@Controller" und "@ResponseBody".
@RestController
wurde seit Frühjahr 4.0.1 bereitgestellt. Diese Controller geben an, dass @RequestMapping-Methoden hier standardmäßig eine @ResponseBody-Semantik annehmen.
In früheren Versionen konnte die ähnliche Funktionalität durch die Verwendung von unten erreicht werden:
@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 von MVC als Ansicht behandelt und direkt und stattdessen vom Dispatcher-Servlet gesendet. Die entsprechenden Konverter konvertieren die Antwort in das zugehörige Format wie text/html, application/xml, application/json.Der Restcontroller ist jedoch bereits mit ResponseBody und den jeweiligen Konvertern gekoppelt. Zweitens wird hier der Antwortkörper automatisch in eine http-Antwort konvertiert, anstatt ihn zu konvertieren.
@Controller
gibt View
zurück. @RestController
gibt ResponseBody
zurück.
@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 von @Controller
, die @Controller
und @ResponseBody
automatisch annotiert, sodass wir unseren Zuordnungsmethoden @ResponseBody
nicht hinzufügen müssen.