Showing posts with label annotation. Show all posts
Showing posts with label annotation. Show all posts

Saturday, September 8, 2018

Json naming convention using JsonNaming Annotations (Spring Boot)

Hallooo man teman !!

Pada postingan kali ini saya mau memberikan tips dalam konversi nama pada json saat pembuatan view object (VO) menggunakan JsonNaming Annotations. Pada saat membuat kelas view object, dalam penulisan variabel pada java yaitu menggunakan camelcase. sedangkan standarisasi penamaan json di nostra adalah menggunakan snakecase, sehingga yang biasa dilakukan adalah dengan menggunakan anotasi @JsonProperty seperti berikut :


Pada setiap field kita perlu menambahkan anotasi JsonProperty, nah kalo fieldnya sedikit sih ga masalah nambahin satu2 disetiap fieldnya tapi kan kalo fieldnya banyak lumayan juga kan nulisnya. Anotasi JsonNaming dapat digunakan untuk menghemat penulisan koding. Implementasinya sangat mudah, tinggal menambahkan anotasi JsonNaming diatas class VO tersebut, berikut implementasinya:



Dengan begitu, kodingan kita lebih sedikit dan menghemat waktu kita dalam membuat view object. berikut hasil nya :


Adapula beberapa tipe yang bisa digunakan dengan menggunakan json naming, diantaranya :

  1. LowerCaseWithUnderscoresStrategy yaitu Case dimana kita ingin mengkonversi menjadi karakter huruf kecil dengan pemisah underscore (_). Contohnya konversi dari "iniVariabel" menjadi "ini_variabel".
  2. LowerCaseStrategy yaitu Case dimana kita ingin mengkonversi menjadi karakter huruf kecil tanpa pemisah. Contohya : konversi dari "iniVariabel" menjadi "inivariabel".
  3. PascalCaseStrategy yaitu Case dimana kita ingin mengkonversi huruf depan menjadi huruf besar. Contohnya : konversi dari "iniVariabel" menjadi "IniVariabel".
Demikian postingan saya kali ini, semoga bermanfaat buat semuanya, terimakasih ^_^


Saturday, March 17, 2018

Android Annotations - annotation-driven framework library

Hello guys! dalam kesempatan ini gw akan nge-share sebuah library Android yang bernama Android Annotations. Ngomong-ngomong soal annotation, sebenernya apa sih? Mungkin kalian yang sudah expert menggunakan medsos pernah dong mention temennya di suatu komen atau chat grup? Nah, annotation di sini juga ga beda jauh dengan mention yang kita gunakan di medsos tersebut. Hanya saja yang kita mention di sini bukan orang melainkan sebuah method atau function yang dapat diproses oleh java-apt.

Apa sih Android Annotations itu?

Singkatnya, merupakan sebuah library yang mengandalkan teknologi Java Annotation Processing Tool atau disingkat java-apt, dimana hal tersebut simplify your code.  Cara kerja library ini bisa dicek di penampakan berikut :




Jadi lo cukup panggil anotasinya dan biarkan library ini generate code-nya. Simpel kan?

Dalam kasus ini gw dah nyiapin sebuah aplikasi sederhana yaitu ContactApp yang bisa kalian akses di sini, aplikasi ini berfungsi buat nyimpen Nama, Nomor Ponsel, dan Alamat Rumah. Fitur yang disajikan yaitu List Contact, Add Contact dan Edit Contact, dimana data tersebut bakalan disimpan di local database dengan memanfaatkan library Room yang pernah dibahas di sini oleh mas Adi Trioka.

Cara install library-nya gimana sih?

Tambahkan baris berikut di file build.gradle pada module app :

Setelah proses instalasi selesai, yuk cek aplikasinya!

Implementasi

Oke guys, setelah kalian cek aplikasi tersebut bisa dilihat begitu simpelnya line of codes di activity AddEditContactActivity. Mari kita bandingkan dengan line of codes tanpa menggunakan AndroidAnnotations :

Dan berikut line of codes setelah mengimplementasikan AndroidAnnotations :

Dari dua file tersebut bisa dilihat transformasi line of codes setelah menggunakan AndroidAnnotations, yang tadinya 134 baris menjadi 96 baris. Simpel kan?

Oh ya, AndroidAnnotations kemampuannya ga sebatas itu lho! Kalian bisa cek langsung beberapa kekuatan yang disajikan oleh library ini di sini. Kalo bingung cara ngeluarin kekuatannya gimana bisa langsung cek di sini juga ya!

Oke guys, sekian dulu dari gw. Semoga dapat bermanfaat dan sampai jumpa lagi di blog berikutnya! See ya!

Referensi :

  • https://github.com/androidannotations/androidannotations
  • http://androidannotations.org/

Sunday, December 18, 2016

Custom Spring Annotation @PreAuthorize

Anotasi @PreAuthorize biasanya di pakai untuk memvalidasi token yang digunakan oleh sebuah request saat memanggil REST API. Anotasi ini biasanya dipasang dalam sebuah class rest controller, dan penggunaannya seperti berikut :


Dalam dokumentasi spring dijelaskan beberapa opsi yang bisa kita gunakan, diantaranya seperti isAuthenticated(), hasRole([role]), permitAll dan lain sebagainya.

Jika kita perhatikan lebih lanjut pada log aplikasi, sebenarnya @PreAuthorize isAuthenticated() ini melakukan sebuah query dan logic. Dari log mode debug bisa dilihat bahwa isAuthenticated() melakukan query ke tabel access_token untuk mengecek apakah token terdaftar dan expired date nya belum berakhir.


Dan ternyata kita bisa membuat sebuah method yang bisa di masukan kedalam anotasi @PreAuthorize seperti isAuthenticated(), yaitu dengan cara menambahkan anotasi @Component pada class java yang method nya akan digunakan.

Berikut contoh implementasinya:


Bisa dilihat pada code diatas bahwa dalam anotasi @PreAuthorize berisi @nostraEmployee.check('NOSTRA'). Cara penggunaannya adalah dengan menambahkan '@' lalu nama class nya yang diawali dangan huruf lower case, dan selanjutnya '.' diikuti nama methodnya. 
Dalam contoh kali ini nama class nya adalah NostraEmployee dan method yang ingin digunakan adalah method check, maka isi dari @PreAuthorize adalah "@nostraEmployee.check('NOSTRA')"

Dan berikut adalah code untuk class NostraEmployee :


Jadi dengan menambahkan annotation @Component pada suatu class kita bisa menggunakan method didalamnya pada anotasi @PreAuthorize. Dan didalam method tersebut kita bisa menambahkan logic tambahan dalam mengauthentikasi token yang mengakses REST API kita.


Sunday, December 14, 2014

Spring MVC : Rest Controller Versioning menggunakan Custom Annotation

Bagi kita yang tidak asing dengan Spring framewok tentu sangat mudah untuk membuat Rest Api dengan menggunakan class Controller. Kita hanya tinggal membuat method yang akan diexpose sebagai rest api dengan menggunakan RequestMapping.
Nah bagaimana jika kita ingin menggunakan versioning pada Rest APInya. Misalnya ada kasus seperti  ini :
Kita sudah punya Rest Api : /person. Tetapi pada suatu saat ada pengembangan baru di Api tersebut dan Api yang lama tidak boleh dihilangkan dulu karena masih ada pihak yang menggunakannya. Maka kita perlu memberikan version pada Rest api tersebut. Rest api yg lama akan dibiarkan. Kemudian dibuat rest api yang baru dengan nama /v2/person.
Cara yang paling sederhana yakni kita buat method controller baru dan diberi RequestMapping("/v2/person").
Tapi cara ini sebenarnya membuat code menjadi tidak clean dan tidak konsisten dalam penamaan.

Pada tulisan saya berikut ini akan saja coba cara untuk melakukan versioning menggunakan @Annotation dan custom RequestMapping.

1. Kita buat dulu class ApiVersion annotation

 @Target({ElementType.METHOD, ElementType.TYPE})  
 @Retention(RetentionPolicy.RUNTIME)  
 public @interface ApiVersion {  
   int[] value();  
 }  

2. Buat class custom RequestMapping handler

 public class ApiVersionRequestMappingHandlerMapping extends RequestMappingHandlerMapping {  
   private final String prefix;  
   public ApiVersionRequestMappingHandlerMapping(String prefix) {  
     this.prefix = prefix;  
   }  
   @Override  
   protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {  
     RequestMappingInfo info = super.getMappingForMethod(method, handlerType);  
     ApiVersion methodAnnotation = AnnotationUtils.findAnnotation(method, ApiVersion.class);  
     if(methodAnnotation != null) {  
       RequestCondition<?> methodCondition = getCustomMethodCondition(method);  
       // Concatenate our ApiVersion with the usual request mapping  
       if(info != null)  
         info = createApiVersionInfo(methodAnnotation, methodCondition).combine(info);  
     } else {  
       ApiVersion typeAnnotation = AnnotationUtils.findAnnotation(handlerType, ApiVersion.class);  
       if(typeAnnotation != null) {  
         RequestCondition<?> typeCondition = getCustomTypeCondition(handlerType);  
         // Concatenate our ApiVersion with the usual request mapping  
         if(info != null)  
           info = createApiVersionInfo(typeAnnotation, typeCondition).combine(info);  
       }  
     }  
     return info;  
   }  
   private RequestMappingInfo createApiVersionInfo(ApiVersion annotation, RequestCondition<?> customCondition) {  
     int[] values = annotation.value();  
     String[] patterns = new String[values.length];  
     for(int i=0; i<values.length; i++) {  
       // Build the URL prefix  
       patterns[i] = prefix+values[i];  
     }  
     return new RequestMappingInfo(  
         new PatternsRequestCondition(patterns, getUrlPathHelper(), getPathMatcher(), useSuffixPatternMatch(), useTrailingSlashMatch(), getFileExtensions()),  
         new RequestMethodsRequestCondition(),  
         new ParamsRequestCondition(),  
         new HeadersRequestCondition(),  
         new ConsumesRequestCondition(),  
         new ProducesRequestCondition(),  
         customCondition);  
   }  
 }  

Annotation @ApiVersion akan dibaca valuenya berapa kemudian akan digabungkan dengan value @RequestMapping, sehingga bisa menjadi /v2/person /v1/person saat diload pertama kali oleh Spring. Jika controller tanpa menggunakan annotation akan tetap dibaca /person

3. Buat class WebMvcConfig

 @Component  
 public class WebMvcConfig extends WebMvcConfigurationSupport {  
   @Bean  
   @Override  
   public RequestMappingHandlerMapping requestMappingHandlerMapping() {  
     return new ApiVersionRequestMappingHandlerMapping("v");  
   }  
 }  

Semua RequestMapping yang menggunakan ApiVersion otomatis akan diawali dengan ''v''.

4. Hilangkan tag annotation-driven diServletContext.xml, gantikan dengan class WebMvcConfig yang sudah dibuat tadi.

 <!--  
 <annotation-driven />  
 -->  
 <beans:bean class="com.andri.sample.version.WebMvcConfig" />  

5. Buat controller person

 @Controller  
 public class HomeController {  
      private static final Logger logger = LoggerFactory.getLogger(HomeController.class);  
      
      @RequestMapping(value = "/person", method = RequestMethod.GET)  
      @ResponseBody  
      public ResponseEntity<String> getPerson(){  
           String result = "this is rest person api version 1";  
           return getJsonResponse(result, HttpStatus.OK);  
      }  

      @RequestMapping(value = "/person", method = RequestMethod.GET)  
      @ResponseBody  
      @ApiVersion(2)  
      public ResponseEntity<String> getPersonV2(){  
           String result = "this is rest person api version 2";  
           return getJsonResponse(result, HttpStatus.OK);  
      }  
      public static <T> ResponseEntity<T> getJsonResponse(T src, HttpStatus status) {  
           HttpHeaders headers = new HttpHeaders();  
           headers.set("Content-Type", MediaType.APPLICATION_JSON_VALUE);  
           return new ResponseEntity<T>(src, headers, status);  
      }  
 }  

6. Start spring application menggunakan jetty atau tomcat, atau application server lain.

Sekarang coba akses url rest nya : /person dan /v2/person

http://localhost:8080/sample/person


http://localhost:8080/sample/v2/person



referensi : http://stackoverflow.com/questions/20198275/how-to-manage-rest-api-versioning-with-spring
source-code : https://andri_khrisharyadi@bitbucket.org/andri_khrisharyadi/spring-rest-versioning.git

Selamat Mencoba.