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?

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 { }


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.


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.


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.


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.


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.


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.


2

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


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.


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.

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.


-3

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


-3

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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.