Exception Handler ve rahatlığı

Arkadaşlar merhaba,

Sizlere bu yazıda kısaca Spring MVC frameworkteki Exception Handler annotationından bahsedeceğim. Bu konu özellikle REST arayüz yazan arkadaşların işine gelebilecek bir teknik.

spring

spring

Malum bir REST arayüz yazdığınız zaman esasen bir API yazmış oluyorsunuz. Haliyle API nizin bir çok metodu oluyor. Bu metodların hepsinde exception handle etmek de can sıkıcı bir durum. Bir süre sonra her metodda exception handle ederseniz ortaya ciddi miktarda tekrarlayan kod çıkacaktır.

Bunu önlemek için geliştirilen çözümlerden biri filtreleri kullanarak fırlatılan exceptionların filtre seviyesinde yakalanması ve işlenmesidir. Ama bu çözüm bütün web trafiğiniz üzerinde  çalışacağından, tüm kodunuzun buna uyumlu olmasına özen göstermeniz gerekiyor.

Diğer yandan yine Spring’in önerdiği bir çözüm ise, hata durumlarına karşı çözücüler yazarak kullanıcıyı istenilen hata sayfalarına yönlendirmek. Fakat bu da REST arayüz yazan  arkadaşların işine pek gelmez çünkü bizim dönmek istediğimiz değerler genellikle JSON nesneleri oluyor.

Bu durumda ortaya ExceptionHandler annotation ı çıkıyor. Bu annotation ı kullanmak için ilgili controllerin, yakalayacağı exception tipini vermeniz gerekli. Kullanacağı metodun içerisinden de istediğiniz loglamaları yaparak gerekli hata nesnesini dönebilirsiniz. Bu bir JSON nesnesi de olabilir, istediğiniz her hangi bir model ve view nesnesi de olabilir.

@ExceptionHandler(AddressNotFoundException.class)
   @ResponseStatus(value=HttpStatus.NOT_FOUND)
public ModelAndView handleAddressNotFoundException(AddressNotFoundException exception) {
ModelAndView modelAndView = new ModelAndView(“nocontact”);
modelAndView.addObject(“message”, exception.getMessage());
return modelAndView;
}

Bu örnekte ModelAndView sınıfı kullanılmış ama burada pek ala ResponseBody annotation ile birlikte bir POJO dönülebilirdi. Bu metodun güzelliği olayı inheritance ile birlikte kullanınca ortaya çıkıyor. Sadece tek bir exception handler metoduyla bütün bir REST apinin exception sorununu çözebilirsiniz. Tek yapmanız gereken Exception Handler metodunu, kullanacağınız base bir controllerın içine yerleştirmek ve işte sağlam yapınız artık hazır!!

Spring Web Serviceleri ve Spring Namespace Handler not found hatasi

Gençler selam,

Uzun aradan sonra bir kaç cümle yazayım dedim, baktım ki evvelden iki madde not almışım bunlardan bahsedeyim diye. Yeri gelmişken sizlere de aktarayım.

Spring süper bir framework, kabulümüzdür. Fakat arada sırada kullanıcıya yardımı dokunmayan hata mesajları da verebiliyor, sonucunda da çokca vakit kaybedebiliyoruz. Ben geçenlerde benzer bir vakit kaybı yaşadım, sizlerle de paylaşayım da mümkün olduğu kadar siz aynı vakti kaybetmeyin.

Spring Namespace Handler not found diye bir hatası var, bu genelde aynı spring jarinin farklı versiyonlar üzerinden birden fazla şekilde uygulamaya katmaktan oluyor, keşke Spring kendisi bunu bize söyleyebilseydi. : )

Ayrica jax-ws spring eklentisini kullanmaya gerek yok, springin SimpleJaxWsServiceExporter sınıfı inanılmaz kullanışlı. Tek sıkıntısı, bu exporter web servisinizi ayri bir port üzerinden sunuyor. Bu durumda aynı uygulama içinden web servisi de sunmak imkansız hale geliyor, denediğinizde orada zaten bir uygulama olduğu hatasını alıyorsunuz.

Herkese iyi geliştirmeler.