Perbedaan antara pegas @Controller dan anotasi @RestController


357

Perbedaan antara pegas @Controllerdan @RestControlleranotasi.

Bisakah @Controlleranotasi digunakan untuk aplikasi Web MVC dan REST?
Jika ya, bagaimana kita bisa membedakan apakah itu aplikasi Web MVC atau REST.

Jawaban:


471
  • @Controller digunakan untuk menandai kelas sebagai Spring MVC Controller.
  • @RestControlleradalah anotasi kenyamanan yang tidak lebih dari menambahkan @Controllerdan @ResponseBodyanotasi (lihat: Javadoc )

Jadi dua definisi pengontrol berikut harus melakukan hal yang sama

@Controller
@ResponseBody
public class MyController { }

@RestController
public class MyRestController { }


48
Saya pikir @RestController juga mengubah respons ke JSON / XML secara otomatis.
— arnabkaycee

1
Hanya berbagi tautan ke tutorial Spring yang menjelaskan perbedaannya spring.io/guides/gs/rest-service
— Mina Samy

9
Juga jika Anda menggunakan mesin templat seperti Thymeleafitu tidak akan bekerja dengan @RestControllerkarena @ResponseBodyyang termasuk dalam penjelasan ini.
— Sonique

3
@ResponseBodymembuat objek yang dikembalikan ke sesuatu yang bisa berada di dalam tubuh, misalnya JSON atau XML ( sumber )
— Martin Thoma

59

Dalam kode di bawah ini saya akan menunjukkan kepada Anda perbedaannya @controller

@Controller
public class RestClassName{

  @RequestMapping(value={"/uri"})
  @ResponseBody
  public ObjectResponse functionRestName(){
      //...
      return instance
   }
}

dan @RestController

@RestController
public class RestClassName{

  @RequestMapping(value={"/uri"})
  public ObjectResponse functionRestName(){
      //...
      return instance
   }
}

yang @ResponseBodydiaktifkan secara default. Anda tidak perlu menambahkannya di atas tanda tangan fungsi.


1
Nama kelas di Java harus mulai ditulis dengan huruf besar, yaitu RestClassName (bukan restClassName).
— Razzle

24

Jika Anda menggunakan, @RestControllerAnda tidak dapat mengembalikan tampilan (Dengan menggunakan Viewresolverdi Spring / springboot) dan ya @ResponseBodytidak diperlukan dalam kasus ini.

Jika Anda menggunakan, @ControllerAnda dapat mengembalikan tampilan di Spring web MVC.


Ya, @ResponseBody dapat menggunakan metode dan menunjukkan bahwa tipe pengembalian harus ditulis langsung ke badan respons HTTP (dan tidak ditempatkan dalam Model, atau ditafsirkan sebagai nama tampilan)
— PraveenKumar Lalasangi


14

Sebenarnya, hati-hati - mereka tidak persis sama.

Jika Anda mendefinisikan pencegat apa pun dalam aplikasi Anda, mereka tidak akan berlaku untuk Pengendali yang dianotasi @RestController, namun mereka bekerja dengan @Controllerpengontrol yang dianotasi.

yaitu. konfigurasi untuk pencegat:

@Configuration
public class WebMvcConfiguration extends WebMvcConfigurerAdapter {


    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TemplateMappingInterceptor()).addPathPatterns("/**", "/admin-functions**").excludePathPatterns("/login**");
    }

}

dan dalam deklarasi kontroler Spring:

@Controller
public class AdminServiceController {...

Akan berhasil

@RestController
public class AdminServiceController {...

tidak berakhir dengan interceptor dikaitkan dengannya.


2
@RestControllerdiperkenalkan di Spring 4x. Anotasi ini juga dijelaskan sendiri oleh @Controllerkarena itu jika tidak berfungsi seperti @Controllermaka laporkan ini sebagai bug.
— gaoagong

@bertybro, itu tidak benar. Anda dapat mengaitkan suatu Interceptorke @RestController.
— Ravi-A-Doer

Aku sudah pasti berhasil terlampir Interceptorke @RestController.
— Ben Barden

11

Seperti yang dapat Anda lihat di dokumentasi Spring ( Spring RestController Documentation ) Anotasi Pengontrol Rest sama dengan anotasi Pengontrol, tetapi dengan asumsi bahwa @ResponseBody aktif secara default, sehingga semua json diuraikan ke objek java.


4

Penjelasan @RestController baru di Spring4 +, yang menandai kelas sebagai pengontrol di mana setiap metode mengembalikan objek domain alih-alih tampilan. Ini singkatan untuk @Controller dan @ResponseBody digulung bersama.


3

@RestControllerdisediakan sejak Musim Semi 4.0.1. Kontroler ini menunjukkan bahwa di sini metode @RequestMapping menganggap semantik @ResponseBody secara default.

Dalam versi sebelumnya, fungsi serupa dapat dicapai dengan menggunakan di bawah ini:

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

  2. <mvc:annotation-driven/> dapat digunakan sebagai salah satu cara untuk menggunakan JSON dengan Jackson atau xml.

  3. MyBean dapat didefinisikan seperti

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

  1. @ResponseBody diperlakukan sebagai tampilan di sini di antara MVC dan dikirim langsung alih-alih dikirim dari Dispatcher Servlet dan konverter masing-masing mengubah respons dalam format terkait seperti teks / html, aplikasi / xml, aplikasi / json.

Namun, Restcontroller sudah digabungkan dengan ResponseBody dan konverter masing-masing. Kedua, di sini, karena alih-alih mengubah respons seseorang, secara otomatis dikonversi ke respons http.


2

@Controllerkembali View. @RestControllerkembali ResponseBody.


2
Anda harus menjelaskan lebih lanjut. Bagaimana ini menjawab pertanyaan?
— Yunnosch

@Yunnosch 'view' adalah ujung depan Anda seperti jsp atau html. ResponseBody dapat berupa xml, json, yaml
— G.Brown

Harap edit jawaban Anda untuk menambahkan informasi bermanfaat. Namun saya masih belum mengerti bagaimana seharusnya menjawab pertanyaan. Bisakah Anda memberikan penjelasan seperti "Ya, Anda bisa / Tidak, tidak bisa, karena ...."?
— Yunnosch

1

Anotasi @RestController diperkenalkan di Spring 4.0 untuk menyederhanakan pembuatan layanan web RESTful. Ini adalah anotasi kenyamanan yang menggabungkan @Controller dan @ResponseBody - yang menghilangkan kebutuhan untuk membubuhi keterangan setiap metode penanganan permintaan kelas pengontrol dengan anotasi @ResponseBody.


0
  • @Controller: Anotasi ini hanya versi khusus @Componentdan memungkinkan kelas pengontrol terdeteksi secara otomatis berdasarkan pemindaian classpath.
  • @RestController: Anotasi ini adalah versi khusus @Controlleryang menambahkan @Controllerdan @ResponseBodyanotasi secara otomatis sehingga kami tidak perlu menambahkan @ResponseBodymetode pemetaan kami.

0

@Controller digunakan dalam sistem lama yang menggunakan JSP. itu dapat mengembalikan tampilan. @RestController adalah untuk menandai controller yang menyediakan layanan REST dengan tipe respon JSON. jadi itu membungkus penjelasan @Controller dan @ResponseBody.


-3

@RestControlleradalah komposisi @Controllerdan @ResponseBody, jika kita tidak menggunakan @ResponseBodytanda tangan di Metode maka kita perlu menggunakan @Restcontroller.


-3

Alih-alih menggunakan @Controller dan @ResponseBody, @RestController memungkinkan Anda mengekspos API Istirahat di Spring 4.0 dan di atas.


Anda ingin mengatakan saya pikir @RestController juga mengubah respons ke JSON / XML secara otomatis. ? Anda menggunakan kalimat abstrak alih-alih menjelaskannya dengan jelas, saya tidak akan menyarankan itu.
— cinqS

Kalau dipikir-pikir itu, @Controller melakukan hal yang sama seperti mengambil hte menghasilkan dan mengkonsumsi tipe mime JSON / XML atau sebaliknya ... @ ResponseBody memberitahu Controller untuk berperilaku seperti titik akhir REST tanpa menghasilkan View. RestController secara implisit melakukan itu.
— CoffeeBeanie
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.