Spring AOP ile Custom Annotation yapımı(Method Profiling, Error Handling)

Cem Ayan
3 min readJan 9, 2021

Validation ve Exception Handling konuları ile uğraşırken kendinizi sürekli tekrar eden kod parçacıkları içerisinde bulabilirsiniz. Örnek gerekirse metodların çalışma zamanlarına ihtiyacınız var ve bunu proje üzerinde implemente etmek istiyorsunuz. Her metodun içine Timer başlatmazsınız ! 😅

Tam olarak bu nokta AOP devreye giriyor. Aslında bu olay Cross-cutting Concerns ile alakalı bir konu. Logging, Profiling, Validation, Security, Exception Handling gibi yapılar bu kavrama örnek olarak gösterilebilir.

Teknik olarak Single Responsibility Principle uygulamamızı sağlar.

Yukarıda da görüldüğü gibi farklı modüllerin ihtiyaçları kesişiyor.

Yazının AOP özeti gibi olmaması için buradaki yazıdan temel kavramlarını inceleyebilirsiniz. (Aspect, Weaving, Advice, JoinPoints, Pointcut)

Bu örnekte Advice üzerinde duracağımız için yandaki görsel bir fikir verebilir.

Metodların çalışma zamanıyla ilgili bir örnek yapalım:

Aşağıdaki gibi basit bir Controller’ımız olsun. Amacımız getProduct’ın ne kadar zamanda çalıştığını bulmak o yüzden LogExecutionTime adlı bir annotation oluşturacağız. Bu annotation’ın görevi metoda girişinden itibaren çıkışa kadar ne kadar zaman geçirdiğini hesaplamak olacak.

ProductController.java

Aşağıdaki şekilde bir annotation oluşutuyoruz.

LogExecutionTime.java

Daha sonra önceden açıkladığım gibi Advice kullanacağız ve az önce oluşturduğumuz annotation’ı vereceğiz. Bu sayede annotation nereye koyduysak Around sayesinde o metodun yaşam süresi boyunca işlem yapabiliyoruz. Hatta ProceedingJoinPoint olduğu için metoda gelen argümanlar üzerinde değişiklik de yapabiliriz.

LogAspect.java

Uygulama üzerinde /product endpoint’ine GET isteği attığımızda aşağıdaki şekilde log geldiğini göreceksiniz. 🍺🍺

2021-01-09 04:09:12.636  INFO 4053 --- [nio-8080-exec-3] c.c.a.controller.ProductController       : ResponseEntity com.cemayan.annotation.controller.ProductController.getProduct(String) executed in 0ms

Herhangi bir metodun üzerine koyduğunuzda çalışacaktır. Böylece merkezi bir yerden tüm modüllerde kullanılabilecek şekilde bir annotation oluşturduk.

Şimdi de Error Handling için bir örnek yapalım:

Null kontrolü esnasında hataya düşüren bir annotation oluşturalım. Bu oluşturacağımız handler gelen DTO üzerinde önceden belirtiğimiz alanının dolu olup olmadığını bulsun ve buna göre hata fırlatsın.

İlk başta ProductController’ımıza bir POST işlemi geldiğini hayal edelim ve Custom bir Validation yapmamız gerekiyor

Controller’da Valid annontation’ı kullanıp DTO’da NotNull koyup validasyon yapabilirdik fakat buradaki amaç daha kompleks senaryolar için ilk zemini hazırlamak. Null kolay bir senaryo olduğu için burada onu yaptım.

Sonrasında ProductNullGuard annontation’u oluşturalım.

ProductNullGuard.java

Bu annotation’ı handle eden yapıyı oluşturalım. Burada yapılan iş metodun içine gelen DTO’yu alıp annotaion’da geçilen fieldName alanları ile kıyaslayıp null şartını kontrol edip bir hata fırlatmak sonrasında ise bunu ControllerAdvice ile yakalamak.

MyNullException adlı bir Exception class’ı oluşturalım.

Şimdi de bu hatayı yakalayacak olan class’ı oluşuturalım.

ControllerAdvice annotation’ı bir interceptor olarak çalışır. Controller üzerinde olan tüm hataları yakalayabilir böylece global bir Error Handling oluşturabilirsiniz. Bu örnekte şimdilik MyNullException sınıfında olan hataları dinliyor.

/product endpointine POST attığımızda hatayı yakalayabilmek için fieldNames içinde dediğimiz gibi productName atmamamız gerekiyor.

Bu örnekten yola çıkarak gelen hatalar üzerinde i18n işlemlerini yapabilirsiniz.

Bunların dışında gelen DTO değerinin daha ilk başta kontrol edilip API katmanından gelen request’i hata ile geri gönderebilirisiniz.

Projeye Github’dan ulaşabilirsiniz.

İyi Okumalar.

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Cem Ayan
Cem Ayan

No responses yet

Write a response