Spring Boot Generic Exception Handler

0 241

Spring Boot ile exception haneler mekanizmasına geçmeden öncelikle Java’daki exception yapılarını incelememiz gerekir.

Aşağıdaki görsel bu yapıyı çok iyi görstermektedir.

Resim 1. Exception class diagram

 

Görselde olduğu üzere Exception ve Error class’ları mevcut ve Exception’lar  Checked ve Unchecked olarak ikiye ayrılmaktadır.

Runtime Exception, adı üstünde çalışma zamanında meydana gelebilecek exception’lardır ve dolayısıyla oluşulabilecek bu exception’ı yakalamak zorunda değilsinizdir.

Örnek olarak öncelikle  UserNotFoundException diye bir exception üreteceğim ve bunu Exception class’ından kalıtacağım.

Şimdi de bir user bulunamadığında bu hatayı vermek istediğimiz bir durum oluşturalım.

Yukarıdaki kodu yazdığımda compile time’da hata alıyorum çünkü kullandığım ide bana şunu diyor. Bu fırlattığın exception ya handle et yani try-catch mekanizması yaz ya da yukarıya gönder.

Tabii bu hatayı fırlattığımız yerde yakalayıp çözebiliriz fakat kod try-cacth mekanizmalarıya dolacaktır ya da dediğimiz gibi en üst katmana kadar bu hatayı fırlatabilirsiniz.

 

Peki bu oluşturduğumuz hatayı Exception’dan değil de RunTimeException class’ından kalıtsaydım ne olurdu?

Bu durumda artık compile time’da hata almıyor oluyorum böyle bir durum oluştuğunda direkt olarak bu hatayla karşılacağız. Aşağıdaki gibi bir hata karşımıza çıkacak.

Peki bu hataların kullanıcıya kadar bu şekilde ulaşması doğru mu? Tabii ki hayır, bu hataları doğru bir şekilde yönetmemiz ve kullanıcıyı yönlendirici mesajlar içermelidir ama nasıl?

Bir web uygulaması yazdığım için aşağıdaki gibi tanımlar bizim için yeterli olacak.

ve artık kullanıcı bir hata mesajı değil, aşağıdaki gibi bir response yapısı görüyor olacak.

Burada belirlediğimiz mesajları da bir dosya üzerinden yönetebiliriz ve farklı dillerde bu hata mesajlarını verebilirsiniz. Bunun yapımızı aşağıdaki gibi değiştirmemiz gerekli.

Yukarıda görüldüğü artık parametrele olarak aldığımız exception message super ile üst class’a göndermiyoruz, burada tek yaptığımız işlem bir key almak ve bu aldığımız key değerini Properties dosyasından okumak için kullanacağız.

resource/messages/messages_tr.properties dosyasını oluşturuyorum ve içerisine exception mesajını bulacağım key-value şeklinde yazıyorum.

Şimdi exception yakaladığımız yerde burada okumasını sağlamamız gerekli. Bunun için bir interface mevcut MessageSource.

Öncelikle oluşturduğumuz dosyanın yolunu belirtmemiz gerekli. Bunun için aşağıdaki gibi bir Bean tanımı yapıyorum.

Artık bütün yapımız hazır. Sıra geldi bu dosyadan belirtilen key ile mesajın bulunması.

Eğer Locale değerini değiştirirseniz bu değere uygun Properties dosyasından gerekli mesajı çekebilirsiniz.

 

Kaynak;

Resim 1: https://data-flair.training/blogs/java-exception/

 

Faydalı olması dileğiyle.

Email adresiniz yayınlanmayacaktır.