RSS
Tampilkan postingan dengan label Java. Tampilkan semua postingan
Tampilkan postingan dengan label Java. Tampilkan semua postingan

Make Swagger with XML Config on Spring 3 MVC

Pada tulisan saya sebelumnya mengenai pembuatan Swagger dengan menggunakan javaConfig. Sekarang saya akan mencoba mengutak-atik dengan cara menggunakan XML Config. Untuk pom.xml sama seperti pada tulisan sebelumnya

Bean Servlet Config
Yang membedakan antara Java Config dengan XML Config adalah pada discpatcher servlet ini. Saya akan meletakan semua configurasi ada disini. Berikut settinganya


        
        
        
        
            
        
        
        
            
            
            
            
            
            
        
        
            
            
        

Configurasi diatas memerlukan sedikit manipulasi. Karena setelah saya cermati pada swagger version ini tidaklah support jika kita ingin melakukanya dengan cara XML Config.
  1. context:component-scan
    Component diatas melakukan scanning terhadap component-component atau annotation yang akan dibaca oleh spring. Pada program saya ini hanya pada package com.test.controller dan com.test.model yang memiliki annotation yang harus dibaca oleh Spring Framework. Controller digunakan untuk Business logic dan Model digunakan untuk data entity getter setter.
  2. mvc:annotation-driven
    Jika pada java config sintax ini digunakan untuk @EnableWebMvc. Karena pada program yang saya gunakan adalah REST yang akan melakukan Request dan response berupa json maka saya butuh ini.
  3. mvc:resources mapping
    Resource mapping digunakan untuk meletakan file-file static pada contoh disini digunakan untuk template dari swagger nya. Didalamnya hanya berupa file static seperti html, javascript, images dan css. Bisa didownload disini
  4. Bean id:swaggerConfig
    Karena kita akan melakukan configurasi menggunakan XML Config. Maka kita akan bermain dengan XML Bean. Class com.test.model.Swagger merupakan class yang digunakan untuk melakukan getter dan setter untuk class com.mangofactory.swagger.configuration.SpringSwaggerConfig. Oleh sebab itu kita perlu melakukan depedency injection com.mangofactory.swagger.configuration.SpringSwaggerConfig kedalam class ini.
  5. Bean id:swagConf
    Pada bean ini terdapat class com.mangofactory.swagger.configuration.SpringSwaggerConfig. Digunakan untuk autowired agar swagger kita bisa di configurasi dan class ini merupakan depedency dari com.test.model.swagger.
  6. Bean id:apiinf
    Pada bean ini kita akan melakukan configurasi dari Api info. Untuk contructor argument pertama digunakan untuk Title dari API Swagger, Argument yang kedua untuk description, yang ketiga untuk terms of service URL, yang keempat merupakan contact yang bisa dihubungi, yang kelima merupakan licence dari Applikasi ini, yang terakhir adalah alamat licence URL.
  7. Bean id:customImplementation
    CustomImplementation merupakan main configurasinya. Dengan adanya bean ini kita bisa melakukan configurasi swagger dengan Api Info yang kita inginkan. Inti dari bean ini sebenarnya adalah SwaggerSpringMvcPluggin. Akan tetapi karena class tersebut tidak support untuk XML Configuration oleh sebab itu pada bean ini saya perlu melakukan sedikit tricky dan saya jelaskan dibawah. Pada Constructor yang diinginkan adalah springSwaggerConfig. Kita sudah buat beanya diatas pada com.test.model.swagger. untuk mendapatkan springSwaggerConfig maka kita masukan contructor-arg nya #{SprngSwaggerConfig.getSpringSwaggerConfig()} artinya memanggil model getSpringSwaggerConfig pada class ber id SpringSwaggerConfig. Kemudia kita perlu set apiInfo nya dan kita pun sudah meng-custome nya dengan nama apiinf.


Tricky di Class com.test.configuration.ApiInfo
public class ApiInfo extends SwaggerSpringMvcPlugin {
    public ApiInfo(SpringSwaggerConfig springSwaggerConfig) {
        super(springSwaggerConfig);
    }
    public SwaggerSpringMvcPlugin getApiInfo(){
        return this;
    }
    public void setApiInfo(com.wordnik.swagger.model.ApiInfo api){
        apiInfo(api);
    }
}
Class disana saya melakukan extends terhadap SwaggerSpringMvcPlugin. Saya lakukan ini karena pada class SwaggerSpringMvcPlugin tidak ada getter dan setter untuk ApiInfo. Sehingga akan timbul pesan error jika kita coba jalankan.

Buat Class com.test.model.Swagger
public class Swagger {
    private SpringSwaggerConfig springSwaggerConfig;
    
    @Autowired
    public void setSpringSwaggerConfig(SpringSwaggerConfig springSwaggerConfig){
        this.springSwaggerConfig=springSwaggerConfig;
    }
    public SpringSwaggerConfig getSpringSwaggerConfig(){
        return this.springSwaggerConfig;
    }
}
Ini digunakan hanya untuk getter dan setter pada springSwaggerConfig yang dibutuhkan oleh framework spring untuk menghandle configurasi dari swagger.

Apache Tomcat Multiple Instance in One Machine Part 2

Lanjutan dari postingan yang pertama, Jika postingan yang pertama merupakan penjelasanya maka sekarang kita melakukan implementasinya.

Re-Structure Folder Apache Tomcat
Tentukan manakah yang akan dijadikan menjadi Tomcat induk atau CATALINA_HOME dan menjadi Tomcat anak atau CATALINA_BASE. Jika sudah, Maka didalam folder CATALINA_BASE make user semua directory tomcat exist begitu juga dengan CATALINA_HOME. Berikut beberapa hal yang perlu diperhatikan saat akan membuatnya
1. Copy Tomcat hasil downloadan menjadi CATALINA_HOME
2. Lakukan hal yang sama kepada CATALINA_BASE, dengan melakukan remove semua isi didalam webapps, logs, temp, lib, dan work.

Konfigurasi instances
Sebelum kita melakukan konfigurasi perlu diketahui juga bahwa jangan sampai apa yang akan kita konfigurasi akan bentrok dengan instances lain. Hal yang diperhatikan adalah
1. Port yang akan digunakan
Apache Tomcat secara default makan dia akan membuat 3 LISTEN Port yaitu, SHUTDOWN, HTTP dan Proxy AJP. Akan tetapi proxy AJP nantinya akan kita remove, Karena kita tidak menggunakanya. Shingga ada 2 port saja yang nantinya harus diperhatikan.
2. Lokasi dari CATALINA_HOME dan CATALINA_BASE
Jika sampai kita salah, Maka kita bisa men screw up applikasi yang kita gunakan.

Pada Windows/Linux
Setting Tomcat as a Master
1. Copy folder tomcat download ke lokasi yang diinginkan
2. Rubah namanya menjadi apache-tomcat-8.0.15-master
3. Remove beberapa folder yang tidak diinginkan seperti (work,webapps,log,temp dan conf) namun sisakan folder bin dan lib beserta isinya. Alasan mengapa kita perlu remove folder tersebut karena folder tersebut hanya akan di gunakan oleh tomcat instances bukan masternya.

Setting Tomcat as a Instance
1. Copy folder tomcat download ke lokasi yang diinginkan
2. Rubah namanya menjadi nama app anda. Misalkan app-sms
3. Remove isi folder bin dan lib. Karena folder tersbut sudah ada di dalam master.
4. Rubah configurasi app anda di dalam folder conf. Kemudian cari file yang namanya server.xml.

  
  
  
  
  
  
    
  
  
    
    
      
        
      
      
        
      
    
  

Rubah lah port yang saya beri tanda higlight diatas. Untuk port shutdown 8006 sedangkan port untuk komunikasi http port 8081 dan untuk redirectport adalah 8444.
5. buath file setenv.bat untuk windows dan setenv.sh untuk linux di dalam folder bin
Untuk di linux
#!/bin/bash
CATALINA_HOME=/opt/apache-tomcat-8.0.15-master
CATALINA_BASE=/opt/app-sms
export CATALINA_HOME CATALINA_BASE
Catalina home adalah untuk master dan catalina_base adalah untuk instance. Setelah itu kita buat script start-app.sh dan stop-app.sh.
Script start-app.sh
#!/bin/bash
. setenv.sh
JAVA_HOME=/usr/bin/java
JAVA_OPTS="-Xmx256m -Xms128m"
export JAVA_HOME JAVA_OPTS
$CATALINA_HOME/bin/catalina.sh start

Script stop-app.sh
#!/bin/bash
. setenv.sh
JAVA_HOME=/usr/bin/java
export JAVA_HOME
$CATALINA_HOME/bin/catalina.sh stop


Untuk di Windows
@echo off
set CATALINA_HOME=/opt/apache-tomcat-8.0.15-master
set CATALINA_BASE=/opt/app-sms
Simpan dengan nama setenv.bat.
@echo off
call setenv.bat
set JAVA_HOME=G:\Java\jdk1.7.0_79
call %CATALINA_HOME%\bin\startup.bat
Kemudian simpan dengan nama start-app.bat
@echo off
call setenv.bat
set JAVA_HOME=G:\Java\jdk1.7.0_79
call %CATALINA_HOME%\bin\shutdown.bat
Simpan dengan nama stop-app.bat.
Jika kita ingin melakukan troubleshoting terhadap script anda maka tinggal ganti kata start pada line "call "%EXECUTABLE%" start %CMD_LINE_ARGS%" menjadi "call "%EXECUTABLE%" run %CMD_LINE_ARGS%" pada file startup.bat yang ada di catalina home. Jika kita tidak menggantinya maka kita tidak akan tau errornya karena pada command prompt dia langsung menghilang tanpa menampilkan errornya apa.

Apache Tomcat Multiple Instance in One Machine Part 1

Pada Tulisan saya ini, Ingin berbagi untuk menjalankan beberapa instance dalam satu machine.

Pertanyaan pertama, Kenapa sih kita harus run multiple instance?
Alasan pertama, Jika applikasi yang kita buat merupakan applikasi yang berbeda dan independence. Contohnya kita memiliki applikasi yang namanya Content Management System dan applikasi yang kedua adalah applikasi sms. Bayangkan jika mereka dalam instance yang sama. Jika ada perubahan applikasi dan perlu untuk di restart. Maka salah satu applikasi yang seharusnya tidak mati, malah ikutan mati. Kalau bahasa mudahnya easy to maintaince.
Alasan yang kedua, Jika kita ingin melakukan management memory pada tiap-tiap applikasi. Jika dalam satu instance kita kurang tau tiap-tiap applikasi memakan berapa banyak memory. Dengan adanya pemisahan instance, kita dapat mengetahui applikasi yang mana yang telah memakan memory yang banyak di server kita. Berikut tampilanya
[takmgr@localhost bin]$ top
top - 16:20:31 up 17:06,  5 users,  load average: 0.20, 0.11, 0.07
Tasks:  87 total,   1 running,  86 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  1.3 sy,  0.0 ni, 94.5 id,  1.6 wa,  1.0 hi,  1.6 si,  0.0 st
KiB Mem :  1529248 total,    78936 free,   330540 used,  1119772 buff/cache
KiB Swap:  2326524 total,  2325620 free,      904 used.  1164836 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
32146 root      20   0   15720   8508   7500 S  0.3  0.6   0:01.14 sshd
32274 takmgr    20   0  404080 152832   9304 S  0.3 10.0   0:11.94 java
32385 takmgr    20   0  404240 152820   9276 S  0.3 10.0   0:12.50 java
32430 takmgr    20   0    8768   3564   3120 R  0.3  0.2   0:00.06 top
    1 root      20   0    8308   6432   3792 S  0.0  0.4   0:09.61 systemd
    2 root      20   0       0      0      0 S  0.0  0.0   0:00.01 kthreadd
    3 root      20   0       0      0      0 S  0.0  0.0   0:17.93 ksoftirqd/0
    5 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:0H
    7 root      20   0       0      0      0 S  0.0  0.0   0:13.75 rcu_sched
    8 root      20   0       0      0      0 S  0.0  0.0   0:08.18 rcuos/0
    9 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcu_bh
   10 root      20   0       0      0      0 S  0.0  0.0   0:00.00 rcuob/0
[takmgr@localhost bin]$ ps aux | grep tomcat
takmgr   32274  2.9  9.9 404080 152832 pts/3   Sl   16:14   0:12 /usr/local/src/jdk1.7.0_79/bin/java -Djava.util.logging.config.file=/opt/sendmail-app/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xmx256m -Xms100m -Djava.endorsed.dirs=/opt/apache-tomcat-7.0.65-master/endorsed -classpath /opt/apache-tomcat-7.0.65-master/bin/bootstrap.jar:/opt/sendmail-app/bin/tomcat-juli.jar -Dcatalina.base=/opt/sendmail-app -Dcatalina.home=/opt/apache-tomcat-7.0.65-master -Djava.io.tmpdir=/opt/sendmail-app/temp org.apache.catalina.startup.Bootstrap start
takmgr   32385 17.7  9.9 404240 152820 pts/3   Sl   16:19   0:12 /usr/local/src/jdk1.7.0_79/bin/java -Djava.util.logging.config.file=/opt/mail-app/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Xmx256m -Xms100m -Djava.endorsed.dirs=/opt/apache-tomcat-7.0.65-master/endorsed -classpath /opt/apache-tomcat-7.0.65-master/bin/bootstrap.jar:/opt/mail-app/bin/tomcat-juli.jar -Dcatalina.base=/opt/mail-app -Dcatalina.home=/opt/apache-tomcat-7.0.65-master -Djava.io.tmpdir=/opt/mail-app/temp org.apache.catalina.startup.Bootstrap start
takmgr   32432  0.0  0.1   6300  2128 pts/3    S+   16:21   0:00 grep --color=auto tomcat
Baris yang dicetak tebal itu merupakan bagian memory.

Sedikit bocoran saja sebenarnya dalam melakukan pemisahan instance ini seperti halnya kita melakukan copy paste apache tomcat menjadi jumlah yang kita ingin tentukan(instance). Jadi sebelum kita melakukan peng-copyan alangkah lebih baiknya kita mengetahui isi dalam folder apache tomcat tersebut
Structure Directory Apache Tomcat
bin: Merupakan directory untuk mengeksekusi perintah start dan stop
conf: Merupakan directory untuk melakukan configurasi pada sisi tomcat instance-nya
webapps: Merupakan directory untuk deploy dan expand applikasi
work: Merupakan directory dari applikasi yang telah dicompile. sehingga kita bisa lihat dalamnya dari applikasi kita
logs: Merupakan kumpulan dari log-log si tomcat
lib: Merupakan directory kumpulan dari library-library yang dibutuhkan oleh tomcat/applikasi kita
temp: Merupakan directory yang digunakan untuk menyimpan data temporary

Make Swagger with JavaConfig on Spring 3 MVC

Pada Postingan ini, saya ingin berbagi pengalaman build swagger di spring 3. Swagger merupakan view yang cantik dan rapi untuk diberikan untuk developer yang ingin memanfaatkan Applikasi kita. Karena setelah mencoba muter-muter searching google tidak ada yang simple dan tidak sesuai dengan applikasi saya. Maka saya akan membagikan pada anda dan sekaligus catatan untuk saya. Akan tetapi contoh yang saya berikan menggunakan cara dengan metode java config bukan by xml. Berikut postinganya semoga bermanfaat.

1. Edit pom.xml. Make sure depedency ini ada

    
org.springframework
spring-core
3.2.2.RELEASE


commons-logging
commons-logging




org.springframework
spring-web
3.2.2.RELEASE


org.springframework
spring-webmvc
3.2.2.RELEASE


com.mangofactory
swagger-springmvc
0.8.8
jar


2. Edit pada dispatcher servletnya. Kalo ditempat saya namanya mvc-dispatcher-servlet.xml file ini diconfig didalam web.xml. Didalam bean dispatchernya tambahkan

        


com.package.configuration merupakan kumpulan paket untuk konfigurasi applikasi kita. Selain untuk applikasi REST nya juga untuk konfigurasi pada swagger. Jadi bahasa panjangnya dari konfigurasi diatas. Disaat applikasi ini run dan ada request masuk dan termaping pada dispatcher ini maka akan dilakukan component scan untuk mendeteksi semua notasi untuk konfigurasi applikasi. Component Scan yang akan di scan tersebut berada di dalam package com.package.configuration.



3. Buat file java untuk configurasi di swaggernya. Ditempat saya namanya SwaggerConfig.java



@Configuration
@EnableSwagger
@EnableWebMvc
public class SwaggerConfig {

private SpringSwaggerConfig springSwaggerConfig;

@SuppressWarnings("SpringJavaAutowiringInspection")
@Autowired
public void setSpringSwaggerConfig(SpringSwaggerConfig springSwaggerConfig) {
this.springSwaggerConfig = springSwaggerConfig;
}

@Bean
public SwaggerSpringMvcPlugin customImplementation(){

return new SwaggerSpringMvcPlugin(this.springSwaggerConfig)
.apiInfo(apiInfo());
}

private ApiInfo apiInfo() {
ApiInfo apiInfo = new ApiInfo(
"Name REST API",
"Description Rest API",
"API TOS",
"username@youremail.com",
"API License",
"Url API License"
);
return apiInfo;
}
}

Apa yang ditulis diatas untuk melakukan configurasi swagger info nya. 4. Konfig untuk Main Applikasinya. Ditempat saya namanya AppConfig.java

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.package.controller")
public class AppConfig extends WebMvcConfigurerAdapter{
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry){
registry.addResourceHandler("/swagger/**").addResourceLocations("/WEB-INF/swagger/");
}
}


Maksud dari code diatas melakukan ComponentScan lanjutan jika di dalam bahasa xml . Untuk Configurasi ini diberlakukan untuk semua yang ada di dalam package com.package.controller. Sedangkan addResourceHandlers untuk memapping resource yang static. Kita masukan resource static untuk template dari swagger nya. Bisa didownload disini Disini



4. Tahapan yang terakhir di sisi Main REST nya(com.package.controller). Ditempat saya namanya AppController.java



@Controller
@Api(value="test",description = "Api Mail")
@RequestMapping("/test")
public class AppController {
@ApiOperation(value = "Send a Email",notes = "This is to send email")
@RequestMapping(value="/send",method=RequestMethod.GET)
public @ResponseBody ResponseEntity sendEmail(){
//code anda
}
}

Yang perlu dicermati hanyalah @Api untuk mendeskripsikan di link rest group contoh diatas adalah /test . Jadi mungkin nanti ada banyak menjadi /test/send , /test/get. Kemudia adalah @ApiOperation juga untuk mendeskripsikan di sub link nya Jadi cukup itu saja cara mengkonfigurasikan Swagger di Spring 3. Kalo ada pertanyaan silahkan Comment


Please copy and share it, if it helps you
 
Copyright 2009 My Note All rights reserved.
Free Blogger Templates by DeluxeTemplates.net
Wordpress Theme by EZwpthemes
Blogger Templates