Bu yazıda @RestController annotationu nedir ne değildir dilim döndüğünce anlatmaya çalışacağım.
Kısaca söylemek gerekirse @Controller ve @ResponseBody annotationlarının yerine kullanılan, RESTFul web servis methodları yazarken kullanılan işleri kolaylaştıran, Spring MVC 4.0'dan sonra hayatımıza girmiş olan bir annotationdır. @RestController kullandığımız sınıflarda ilgili adreslere cevap verecek methodlar için ayrıca @ResponseBody annotationu eklenmez. Sadece mapping işleminin yapılması yeterli olacaktır.
Spring dökümanlarda da aşağı yukarı bu şekilde tanımlanmaktadır. Buradan Spring dökümandaki tanıma da şahit olabilirsiniz.
Böyle kuru kuru tanım yapınca olmuyor tabi. Eskiye yeniye bir göz atmak gerek.
"İşler nasıl kolaylaştı, önceden ne yapıyorduk şimdi ne yapacağız" bir göz atalım.
Öncelikle @Controller annotationu, bildiğiniz gibi ilgili sınıfın bir controller sınıfı olduğunu belirtir. Yani (spring bean configuration file) Spring konfigürasyon ayarlarımızı barındıran
(eğer başka bir isim verileceği web.xml de tanımlanmamışsa) projeadi-servlet.xml olarak adlandırılmış xml dosyasında;
<
context:component-scan
base-package
=
"com.[projeAdi].[controllerPaketi]"
/>
<!-- support for mvc-annotation -->
<
mvc:annotation-driven
/>
şeklinde belirterek Spring tarafından otomatik tespit edilmesini sağladığımız paketin içeriğindeki tüm alt sınıfların başında kullanılan annotationdır.
@ResponseBody annotationu ise, isteğin cevaplandırılacağı methodun başına yazılır. Böylece nasıl mapping işlemi yapılmışsa, o adres parametreleri ile çağırıldığında ilgili methoda yönlendirilir ve method çalıştırılır.
Aşağıdaki görselde kullanıcıdan gelen isteğin Spring tarafından hangi yollardan geçerek cevaplandırıldığı daha net anlaşılabilir.
Örneğin bir sınıfımız olsun. Bu sınıf controller sınıfımız demek için başına @Controller annotationunu ekliyoruz.
@Controller
public class ListUserController {
...
...
...
...
}
sınıfımızın başına @Controller annotationu eklendiğinde, eğer spring konfigürasyon ayarlarını doğru yapmışsak, eclipse derleyicisi otomatik olarak ağaç gösterimi üzerinde sınıfın üzerine "S" işareti koyacaktır.
İlgili sınıfın Spring Controller sınıfı olduğundan emin olduktan sonra içerisine bir isteğe cevap verecek bir method yazıyoruz ve yine annotationlar aracılığıyla mapping işlemini gerçekleştiriyoruz. İlgili adrese istek yapıldığında cevap vermesi için @ResponseBody annotationunu method başına ekliyoruz.
@RequestMapping(method = RequestMethod.GET, value = "/service/listUsers")
@ResponseBody
public int listUsers() {
// burada gerekli istek işlemleri yapılır.
return 0;
}
/service/listUsers adresi çağrıldığında bu method cevap verecektir. Adresleme işlemini ve bu methodun cevap vereceğini @RequestMapping ve @ResponseBody annotationları ile belirtmiş olduk.
Yukarıda yazılan kodlar Spring MVC 4.0'a kadar olan kullanılan yöntemler idi.
@RestController ile nasıl yazdığımıza bir göz atalım şimdi de.
@RestController
// @RequestMapping("/service")
public class ListUserController {
...
...
...
...
}
sınıfımızın başında @RequestMapping işlemi de yapılabilir yukarıda kod içerisinde gerçekleştirildiği gibi.
İsteklere cevap verecek olan methodumuz için artık sadece adresleme(mapping) işlemi yapmamız yeterli olacaktır.
@RequestMapping(method = RequestMethod.GET, value = "/listUsers")
public int listUsers() {
// burada gerekli istek işlemleri yapılır.
return 0;
}
Uzun lafı kısası; Spring 4.0 ile hayatımızı girmiş olan @RestController annotationu, @Controller ve @ResponseBody annotationunun yapmış olduğu işlemleri tek başına yapar.
Son olarak aşağıdaki kaynaklara da göz atabilirsiniz;
http://www.benchresources.net/spring-mvc-creating-restful-web-service-using-annotation/
http://www.benchresources.net/spring-mvc-4-0-restful-web-service-using-restcontroller-annotation/
https://www.genuitec.com/spring-frameworkrestcontroller-vs-controller/
</HappyCoding>