Unterschied zwischen der Annotation von spring @Controller und @RestController

357

Unterschied zwischen Feder @Controllerund @RestControllerAnmerkung.

Kann @ControllerAnnotation 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?

Srikanth
quelle

Antworten:

471
  • @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 { }
micha
quelle
48
Ich denke, @RestController konvertiert auch die Antwort automatisch in JSON / XML.
Arnabkaycee
1
Teilen Sie einfach einen Link zu einem Spring-Tutorial, in dem der Unterschied erklärt wird. Spring.io/guides/gs/rest-service
Mina Samy
9
Auch wenn Sie Template - Engine verwenden , wie Thymeleafes wird nicht mit der Arbeit @RestControllerwegen @ResponseBodyder in dieser Anmerkung enthielt.
Sonique
3
@ResponseBodymacht die zurückgegebenen Objekte zu etwas, das im Körper sein könnte, zB JSON oder XML ( Quelle )
Martin Thoma
59

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.

BERGUIGA Mohamed Amine
quelle
1
Klassennamen in Java sollten groß geschrieben werden, dh RestClassName (nicht restClassName).
Razzle
24

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.

Ravi Wadje
quelle
Ja, @ResponseBody kann auf eine Methode angewendet werden und gibt an, dass der Rückgabetyp direkt in den HTTP-Antworttext geschrieben (und nicht in ein Modell
eingefügt
14

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.

Bertybro
quelle
2
@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.
Gaoagong
@bertybro, das ist nicht ganz richtig. Sie können ein Interceptormit einem verknüpfen @RestController.
Ravi-A-Doer
Ich habe sicherlich erfolgreich eine Interceptoran eine angehängt @RestController.
Ben Barden
11

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.

CAAY
quelle
4

Die neue Annotation @RestController in Spring4 +, die die Klasse als Controller kennzeichnet, bei der jede Methode ein Domänenobjekt anstelle einer Ansicht zurückgibt. Es ist eine Abkürzung für @Controller und @ResponseBody.

yancy
quelle
3

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

  1. @RequestMappinggekoppelt mit @ResponseBodywie@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 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.

hi.nitish
quelle
2

@Controllerkehrt zurück View. @RestControllerkehrt zurück ResponseBody.

G. Brown
quelle
2
Sie sollten mehr erklären. Wie beantwortet dies die Frage?
Yunnosch
@ Yunnosch 'view' ist dein Frontend wie jsp oder html. ResponseBody kann xml, json, yaml sein
G.Brown
Bitte bearbeiten Sie Ihre Antwort, um hilfreiche Informationen hinzuzufügen. Allerdings verstehe ich immer noch nicht, wie es die Frage beantworten soll. Könnten Sie eine Erklärung wie "Ja, Sie können / Nein, Sie können nicht, weil ..." formulieren?
Yunnosch
1

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.

Dwij Sheth
quelle
0
  • @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.
Prashant Goswami
quelle
0

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

Tharindu Eranga
quelle
-3

@RestControllerist die Zusammensetzung von @Controllerund @ResponseBody, wenn wir die @ResponseBodyIn-Method-Signatur nicht verwenden, müssen wir die verwenden @Restcontroller.

Sambhu
quelle
-3

Anstatt @Controller und @ResponseBody zu verwenden, können Sie mit @RestController Rest-APIs in Spring 4.0 und höher verfügbar machen.

CoffeeBeanie
quelle
Sie möchten sagen, dass @RestController die Antwort auch automatisch in JSON / XML konvertiert. ? Sie haben einen abstrakten Satz verwendet, anstatt ihn klar zu erklären. Das werde ich nicht vorschlagen.
cinqS
Wenn Sie sich das vorstellen, macht @Controller dasselbe, wie es benötigt, um MIME-Typen JSON / XML oder auf andere Weise zu erzeugen und zu verbrauchen ... @ ResponseBody weist Controller an, sich wie ein REST-Endpunkt zu verhalten, ohne eine Ansicht zu erstellen. RestController macht das implizit.
CoffeeBeanie