Jawaban:
@Controller
digunakan untuk menandai kelas sebagai Spring MVC Controller.@RestController
adalah anotasi kenyamanan yang tidak lebih dari menambahkan @Controller
dan @ResponseBody
anotasi (lihat: Javadoc )Jadi dua definisi pengontrol berikut harus melakukan hal yang sama
@Controller
@ResponseBody
public class MyController { }
@RestController
public class MyRestController { }
Thymeleaf
itu tidak akan bekerja dengan @RestController
karena @ResponseBody
yang termasuk dalam penjelasan ini.
@ResponseBody
membuat objek yang dikembalikan ke sesuatu yang bisa berada di dalam tubuh, misalnya JSON atau XML ( sumber )
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 @ResponseBody
diaktifkan secara default. Anda tidak perlu menambahkannya di atas tanda tangan fungsi.
Jika Anda menggunakan, @RestController
Anda tidak dapat mengembalikan tampilan (Dengan menggunakan Viewresolver
di Spring / springboot) dan ya @ResponseBody
tidak diperlukan dalam kasus ini.
Jika Anda menggunakan, @Controller
Anda dapat mengembalikan tampilan di Spring web MVC.
@RestController
kelas yang dianotasi sama dengan @Controller
tetapi @ResponseBody
pada metode handler tersirat.
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 @Controller
pengontrol 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.
@RestController
diperkenalkan di Spring 4x. Anotasi ini juga dijelaskan sendiri oleh @Controller
karena itu jika tidak berfungsi seperti @Controller
maka laporkan ini sebagai bug.
Interceptor
ke @RestController
.
Interceptor
ke @RestController
.
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.
@RestController
disediakan 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:
@RequestMapping
ditambah dengan @ResponseBody
suka@RequestMapping(value = "/abc", method = RequestMethod.GET, produces ="application/xml")
public @ResponseBody MyBean fetch(){
return new MyBean("hi")
}
<mvc:annotation-driven/>
dapat digunakan sebagai salah satu cara untuk menggunakan JSON dengan Jackson atau xml.
@XmlRootElement(name = "MyBean")
@XmlType(propOrder = {"field2", "field1"})
public class MyBean{
field1
field2 ..
//getter, setter
}
@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.
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.
@Controller
: Anotasi ini hanya versi khusus @Component
dan memungkinkan kelas pengontrol terdeteksi secara otomatis berdasarkan pemindaian classpath.@RestController
: Anotasi ini adalah versi khusus @Controller
yang menambahkan @Controller
dan @ResponseBody
anotasi secara otomatis sehingga kami tidak perlu menambahkan @ResponseBody
metode pemetaan kami.@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.
Alih-alih menggunakan @Controller dan @ResponseBody, @RestController memungkinkan Anda mengekspos API Istirahat di Spring 4.0 dan di atas.