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.

Srikanth
sumber

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 { }
micha
sumber
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.

BERGUIGA Mohamed Amine
sumber
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.

Ravi Wadje
sumber
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.

bertybro
sumber
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.

CAAY
sumber
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.

yancy
sumber
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.

Hai, India
sumber
2

@Controllerkembali View. @RestControllerkembali ResponseBody.

G. Brown
sumber
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.

Dwij Sheth
sumber
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.
Prashant Goswami
sumber
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.

Tharindu Eranga
sumber
-3

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

sambhu
sumber
-3

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

CoffeeBeanie
sumber
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