it-swarm.com.de

Unterschied zwischen der Beschriftung spring @Controller und @RestController

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?.

312
Srikanth
  • @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 { }
437
micha

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.

18
Bart

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.

16
Ravi Wadje

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.

12
bertybro

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.

8
CAAY

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".

4
yancy

@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:

  1. @RequestMapping gekoppelt mit @ResponseBody wie @RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml") public @ResponseBody MyBean fetch(){ return new MyBean("hi") }

  2. <mvc:annotation-driven/> kann als eine der Möglichkeiten zur Verwendung von JSON mit Jackson oder XML verwendet werden.

  3. MyBean kann wie folgt definiert werden

@XmlRootElement(name = "MyBean") @XmlType(propOrder = {"field2", "field1"}) public class MyBean{ field1 field2 .. //getter, setter }

  1. @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.

2
hi.nitish

@Controller gibt View zurück. @RestController gibt ResponseBody zurück.

0
G.Brown
  • @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.
0