JAX-RS (ABORTING FILTER)

     Bu yazımızda filter konusuna devam ediceğiz.Bu seferde kaynak sınıfımız için yazdığımız bir filter'ımızı bazı koşullarda kullanması,bazı koşullarda ise kullanmaması için bir filter daha yazacağız.Bir süzgeç düşünün ve orada portakal suyunu çekirdeklerinden süzüp içeceksiniz.İşte portakalın çekirdekleri ilk yazdığımız filter'a takılıyor dolayısıyla ikinci yazdığımız filterda(mide) bunu kullanmıyor. :).Burada ilk filter çekirdeği görünce,ikinci filter'ı iptal ediyor.Mesela gelen isteklerin veya herhangi bir bilginin log'lanmasını istemediğimiz zaman uygulayabiliriz.Şimdi kodlarımıza bakıp daha iyi anlayalım.


import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("/")
public class ApplicationConfig extends Application {
}
view raw G1 hosted with ❤ by GitHub
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
@Path("/")
public class MyResource {
@GET
@Path("{path:.*}")
public String getResponse(@PathParam("path") String path) {
return "dummy-response for " + path;
}
}
view raw G2 hosted with ❤ by GitHub
@Priority(1)
@Provider
public class InvalidRequestFilter implements ContainerRequestFilter{
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
Response resForInvalidRequest = kontrol(requestContext);
if(resForInvalidRequest!=null)
requestContext.abortWith(resForInvalidRequest);
}
private Response kontrol(ContainerRequestContext requestContext){
UriInfo uriInfo=requestContext.getUriInfo();
String path=uriInfo.getPath();
if(path.equals("orders/history")){
String msg = String.format("The feature is not yet supported: %s%n", path);
CacheControl cc=new CacheControl();
cc.setNoStore(true);
Response response=Response.status(Response.Status.NOT_IMPLEMENTED)
.cacheControl(cc)
.entity(msg)
.build();
return response;
}
return null;
}
}
view raw G3 hosted with ❤ by GitHub
import java.io.IOException;
import javax.annotation.Priority;
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;
@Priority(2)
@Provider
public class LogFilter implements ContainerRequestFilter, ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext reqContext) throws IOException {
System.out.println("-- request info --");
UriInfo uriInfo = reqContext.getUriInfo();
log(uriInfo, reqContext.getHeaders());
}
@Override
public void filter(ContainerRequestContext reqContext,
ContainerResponseContext resContext) throws IOException {
System.out.println("-- response info --");
UriInfo uriInfo = reqContext.getUriInfo();
log(uriInfo, resContext.getHeaders());
}
private void log(UriInfo uriInfo, MultivaluedMap<String, ?> headers) {
System.out.println("Path: " + uriInfo.getPath());
System.out.println("HEADERS:");
headers.entrySet().forEach(h -> System.out.println(h.getKey() + ": " + h.getValue()));
}
}
view raw G4 hosted with ❤ by GitHub
Kodlarımızda gördüğünüz gibi.InvalidRequestFilter sınıfımızda yazdığımız kontrol methodunda gelen isteğe göre değer döndürülüyor.Sınıf adı Ingilizce metod Türkçe ne biçim iş yapıyorsun diyebilirsiniz :) fakat kodlar buradaki sayfaya ait ve ben bu kodları yazarken bazı yerlerde ufak oynamalar yapıyorum.Şimdi de çıktımıza bakalım. GET/orders/history isteği hariç diğer tüm istekler sunucumuzda kayıt ediliyor.Aşağıdaki çıktılarda gördüğünüz gibi.


Umarım faydalı olmuştur.Görüşmek üzere.

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 ...