JAX-RS (FILTER BINDING & DYNAMIC FILTER BINDING)

     Herkese merhaba.Bu yazımızda da yine filter konusunda yazacağımız filter sadece belli kaynak fonksiyonlarına özel olacak.Bunu yaparken ilk defa kendi açıklamamızı oluşturacağız.Daha sonra yazdığımız filter ve kullanacağı kaynak fonksiyon,sınıf,interface veya her neyse,bu açıklama ile işaretlenecek.Binding olayıda tam da burada karşımıza çıkıyor.Türkçe anlamıyla bağlayıcı olan bu kelimenin görevi anlaşılacağı gibi adından geliyor.Gördüğünüz gibi filter ile belli bir kaynağı birbirine bağlayacak.Ek açıklamamızı (Annotation) kodlarken satırlarımızı tek tek açıklayacağız.Şimdi kodlama kısmına geçelim.Üzerinde duracağımız tek yer annotation'ın oluşturulduğu yer.Yazdığımız bu ek açıklama ile bağlayacağımız yerleri işaretlememiz gerekiyor.Kodlar üzerinden devam edelim.



import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.ws.rs.NameBinding;
@NameBinding
@Target({ElementType.TYPE,ElementType.METHOD})
@Retention(value=RetentionPolicy.RUNTIME)
public @interface Logged {
}
view raw Gokhan hosted with ❤ by GitHub
Şuan logged adında bir annotation oluşturduk.@target açıklaması yazdığımız logged açıklamasının nerelerde kullanılabileceğini belirtiyor.TYPE ve METHOD birlikte kullanılmış.Bunun anlamı yazdığımız annotation hem fonksiyonlar üzerinde hem de sınıf,interface,enum gibi yapılarda çalışabilir.Bir sonraki satırda ise @Retention açıklamasında bu yazdığımız açıklamaya hangi zamanda erişilsin.Bu değerin varsayılanı RetentionPolicy.CLASS'tır.Burada kullanılan RUNTIME ise bu açıklamaya sadece çalışma zamanında erişim vardır anlamındadır.Bu da java da Java Reflection API tarafından yapılır.Buradan araştırabilirsiniz.Şimdide kodlarımızın geri kalanına bakıp programımızı derleyelim.
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.ext.Provider;
import java.io.IOException;
@Provider
@Logged
public class LogFilter implements ContainerRequestFilter, ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext reqContext) throws IOException {
System.out.println("-- req info --");
UriInfo uriInfo = reqContext.getUriInfo();
log(uriInfo, reqContext.getHeaders());
}
@Override
public void filter(ContainerRequestContext reqContext,
ContainerResponseContext resContext) throws IOException {
System.out.println("-- res info --");
UriInfo uriInfo = reqContext.getUriInfo();
log(uriInfo, resContext.getHeaders());
}
private void log(UriInfo uriInfo, MultivaluedMap<String, ?> headers) {
System.out.println("Path: " + uriInfo.getPath());
headers.entrySet().forEach(h -> System.out.println(h.getKey() + ": " + h.getValue()));
}
}
view raw Gokhan hosted with ❤ by GitHub
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
@Path("/customers")
public class MyResource {
@GET
public String getAllCustomers() {
System.out.println("in getAllCustomers()");
return "dummy-response for all customers";
}
@Logged
@GET
@Path("{id}")
public String getCustomerById(@PathParam("id") String id) {
System.out.println("in getCustomerById()");
return "dummy-response for customer " + id;
}
}
view raw Gokhan1 hosted with ❤ by GitHub
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/")
public class ApplicationConfig extends Application{
}
view raw Gokhan2 hosted with ❤ by GitHub


Çıktımız ise şu şekilde olacak.Sadece GET/customers gibi bir istekte sunucumuza herhangi bir ek kayıt düşmeyecek.Yani filter kullanılmayacak fakat eğer GET/customers/{id} gibi bir istek gelirse filter kullanılacak.Aşağıdaki görsellerde de çok açık bir şekilde görünüyor.




Bu işi dinamik olarakta gerçekleştirebiliriz.Yani aynı şekilde istediğimiz alanlar için bir filter yazmak istiyorsak,dynamicfeature interfaceni imlement edip gerekli kontrolleri yapamız gerekir.

import javax.ws.rs.container.DynamicFeature;
import javax.ws.rs.container.ResourceInfo;
import javax.ws.rs.core.FeatureContext;
import javax.ws.rs.ext.Provider;
import java.lang.reflect.Method;
@Provider
public class FilterRegistrationFeature implements DynamicFeature {
@Override
public void configure(ResourceInfo resourceInfo, FeatureContext context) {
if (MyResource.class.isAssignableFrom(resourceInfo.getResourceClass())) {
Method method = resourceInfo.getResourceMethod();
if (method.getName().toLowerCase().contains("order")) {
System.out.println("registering LogFilter");
context.register(new LogFilter());
}
}
}
}
view raw Gokhan hosted with ❤ by GitHub

Umarım faydalı olmuştur.Sağlıcakla kalın.

Hiç yorum yok:

Yorum Gönder

Spring Boot Uygulamasını Heroku üzerinde Deploy Etme

Bu yazımızda sizlere spring boot ile yazılmış basit bir Rest api'nin heroku üzerinde nasıl deploy edebileceğimizi göstereceğim. Önce ...