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.