Living life and Make it Better

life, learn, contribute

Endy Muhardin

Software Developer berdomisili di Jabodetabek, berkutat di lingkungan open source, terutama Java dan Linux.

Road to Java EE

Another Frequently Asked Question.

Saya sudah menguasai Java Standard Edition dan sekarang mau belajar Java Enterprise Edition. Bagaimana learning-path-nya?

Inilah Road to Java Enterprise versi saya:

Tahap Pertama

  1. Belajar HTTP.
    • bedanya GET dan POST
    • apa itu session
    • bagaimana cara implement state management
    • konsep multipart dan mekanisme upload file
  2. Belajar Servlet Fundamental.
    • Servlet
    • Filter
    • Listener
    • Tidak perlu repot2 belajar JSP
  3. Belajar JDBC. Pastikan Anda tau:
    • Cara connect ke database
    • Cara eksekusi DML
    • Cara menjalankan SQL select
  4. Belajar Database Transaction Fundamental. Pastikan Anda tau:
    • Syarat-syarat untuk mengaktifkan transaction
    • Local vs Managed Transaction
    • Programmatic vs Declarative Transaction
    • Transaction Isolation Level
    • Transaction Propagation

Untuk tahap pertama, itu dulu saja.

Kalau sudah ngerti itu, bisa dengan mudah memahami:

  • Web framework apapun (Spring MVC, Struts 1 dan 2, Java Server Faces)
  • Database abstraction framework seperti Spring JDBC, iBatis, dan Hibernate.

Tahap Kedua

Tahap kedua ini relatif rumit. Karena itu, untuk tiap materi, pastikan:

  • Anda tau masalah yang mendasari munculnya teknologi ini.
  • Anda tau cara memecahkan masalah tersebut dengan teknologi ybs.
  • Anda tau keterbatasan dari teknologi ybs.
  • Anda tau alternatif solusi selain menggunakan teknologi ybs
  1. Remote Method Invocation
    • Mekanisme remote invocation
    • Mekanisme rmiregistry
    • Cara membuat remote object
    • Cara mempublish remote object
    • Cara membuat client yang mengakses remote object
  2. Java Messaging Service (JMS)
    • Arsitektur Messaging
    • Point to Point vs Publisher - Subscriber
    • Bedanya Durable dan Non-Durable Subscriber
    • Cara mengirim message
    • Cara menerima message
  3. Enterprise Java Bean
    • Stateless Session Beans
    • Stateful Session Beans
    • Message Driven Beans
    • Entity Beans dan evolusinya dari versi 2 sampai versi 3.

Kalau sudah menyelesaikan tahap 2 ini, seharusnya Anda akan mudah memahami Seam Framework dan bisa menggunakan sebagian besar fitur dari application server Java (seperti Glassfish, Geronimo, JBoss AS, IBM Websphere, Oracle iAS, BEA Weblogic, dsb).

Selain itu, masih ada tahap ketiga, yaitu urusan lain-lain seperti JMX, dan teman-temannya. Tapi saya yakin kalau sudah lulus tahap dua, sudah tidak bingung lagi mau belajar apa.

Daftar di atas memang cukup menggetarkan hati. Sebagai gambaran, saya sendiri butuh waktu satu tahun lebih untuk memahami itu semua.

Tapi jangan khawatir, kalau Anda mulai hari ini, berarti tahun depan sudah menguasai. Kalau menunda belajar, bukan saja akan lebih lama selesainya, tapi juga materinya akan lebih banyak. Framework integrasi ala OSGi dan fitur baru Java 7 seperti Closure sudah di ambang pintu.

Mulailah dari sekarang !!!


Kutu Loncat

Di milis Java sedang ribut urusan gaji programmer. Topik ini adalah topik abadi. Sepanjang hidup saya di milis ini, paling tidak urusan gaji dibahas setahun dua kali. Kadang-kadang lebih sering.

Kita tidak akan membahas tentang urusan gaji … mungkin nanti di posting berikutnya. Kita akan membahas tentang fenomena pindah kerja terlalu sering, a.k.a kutu loncat. Menurut salah seorang komentator, programmer Java cenderung kutu loncat.

Sedikit informasi latar belakang, sejak lulus di tahun 2001 sampai 2008 ini, saya sudah kerja di 7 perusahaan berbeda. Kalau dirata-rata, berarti tiap tahun pindah kerja. Saat ini saya membangun perusahaan sendiri. Jadi saya akan bahas dari sudut pandang karyawan, dan juga pemilik perusahaan.

Sudut Pandang Karyawan

Sebagai karyawan, pindah kerja itu hal yang biasa. Yang penting jangan terlalu sering, dan menggunakan sopan-santun yang benar.

Kalau kita terlalu sering pindah kerja, misalnya setahun 3 kali (berarti rata-rata 4 bulan), kita akan mengalami beberapa kesulitan.

Kesulitan pertama adalah dilema dalam mengupdate CV. Apakah 3 perusahaan tersebut akan kita tulis atau tidak? Kalau ditulis, HRD akan bertanya-tanya, ada apa dengan kandidat ini? Kok dalam satu tahun sudah pindah 3 kali. Terlalu menuntut, rewel, atau apa? Kalau tidak ditulis, HRD akan bertanya kenapa kandidat ini pengangguran beberapa bulan?

Kesulitan kedua, waktunya akan habis untuk masa transisi. Untuk bisa efektif, seorang karyawan butuh 1-2 bulan penyesuaian. Kalau kita resign, butuh waktu 2-4 minggu untuk transfer knowledge ke penerus kita. Kerugian di kita juga, kita tidak bisa mengakumulasi pengalaman.

Bagaimana sopan santunnya? Mudah saja:

  1. Beritahukan sedini mungkin. Idealnya 1 bulan, kalau tidak bisa ya minimal 2 minggu sebelumnya

  2. Selesaikan semua tanggung jawab dan hutang (kalau ada)

  3. Lakukan proses handover dengan benar

Kapan kita pindah kerja?

Menurut saya, bila:

  • Pekerjaan kita sudah tidak lagi membuat kita tambah pintar

  • Kompensasi yang kita terima tidak sebanding dengan kontribusi yang kita berikan

  • Ada tawaran yang minimal 50% lebih besar (annually, bukan monthly). Kalau lebih sedikit dari itu, tidak sebanding dengan kerepotan pindah kerja.

Sudut Pandang Perusahaan

Kalau karyawannya bagus, perusahaan akan rugi kalau dia resign, karena:

  • butuh waktu untuk rekrutasi

  • butuh waktu untuk training

  • butuh waktu untuk handover/transisi

Oleh karena itu, perusahaan harus berusaha mempertahankan karyawannya yang bagus. Apalagi untuk software development company. Komputer rusak gampang diganti, tapi top developer resign, urusannya jauh lebih kompleks. Keseluruhan daya saing perusahaan terletak pada otak karyawannya.

Untuk sudut pandang perusahaan, saya akan lebih fokus tentang bagaimana sudut pandang yang benar dalam memandang karyawannya.

Selalu berikan training. Training ini adalah untuk memastikan karyawan tersebut melakukan tugasnya dengan benar. Saya pernah dengar kutipan berikut, “Train your employee and risk they leave, or not train your employee and risk they stay”. Arti kutipan di atas, resiko kita bila memberikan training adalah bila karyawan resign, kita rugi biaya training. Sebaliknya, bila kita tidak memberikan training, kita menanggung resiko bila karyawan tersebut tidak perform dan tak kunjung resign.

Kesalahan besar yang lainnya, berkaitan dengan training, menganggap karyawan yang otodidak tidak butuh training. Ini pandangan yang sempit, menganggap bahwa training hanyalah sarana menambah knowledge belaka.

Training, apalagi external training, memiliki benefit lain disamping menambah pengetahuan:

  1. Memperluas wawasan

  2. Memperluas pergaulan

  3. Menimbulkan sense-of-significance dalam karyawan. Perasaan bahwa dia tidak semata diperah, tapi juga dibesarkan. Perasaan bahwa perusahaan peduli dengan peningkatan kemampuannya. Urusan bahwa materi tersebut bisa dipelajarinya sendiri tidaklah penting.

Evaluasi kompensasi vs kontribusi secara periodik. Karyawan yang baik kemampuannya akan cepat meningkat. Hari ini baru bisa Java Fundamental, enam bulan kemudian sudah mengerti Spring Framework. Peningkatan kemampuan jelas mengimplikasikan peningkatan market-value si karyawan.

Perusahaan harus memastikan bahwa dialah yang pertama mengetahui peningkatan kemampuan tersebut, dan kemudian mengapresiasinya. Di kantor tempat saya bekerja sebelumnya, banyak orang-orang hebat, yang kehebatannya baru disadari perusahaan setelah orang tersebut resign. Sungguh suatu kesia-siaan yang besar. Saya tidak tahu apakah perusahaan tidak bisa mengenali orang hebat, tidak mau mengapresiasi orang hebat, atau tidak mampu mengapresiasi dengan layak. Yang saya tahu hanya satu, orang hebat satu persatu meninggalkan perusahaan.

Jadi, perusahaan harus selalu mengamati perkembangan karyawannya. Sadari bahwa ulat sudah menjadi kupu-kupu. Kemudian berikan kompensasi yang sesuai.

Kompensasi tidak selalu berimplikasi naik gaji. Banyak kompensasi non-gaji yang bisa digunakan, diantaranya:

  • menambah jatah cuti

  • mengirim karyawan ikut event

  • mengikutkan karyawan pelatihan

  • mendorong karyawan ikut dalam kegiatan komunitas

  • mengupgrade komputernya

  • dan masih banyak teknik lainnya, asal Anda kreatif saja.

Kesalahan berikutnya, perusahaan, terutama startup, sering menganggap karyawan ber-etos kerja seperti founder. Karena foundernya kerja 10 jam sehari tanpa lembur, maka dianggap karyawannya juga akan rela melakukan hal serupa. Kalau foundernya Sabtu Minggu ngantor dengan gembira, dianggapnya karyawan juga harus ngantor di masa weekend sambil tersenyum. Bila client telat bayar, karyawan diharapkan akan mengerti.

Ini pemahaman yang salah. Karyawan tidak memiliki keterkaitan emosi terhadap perusahaan sekuat foundernya. Mereka punya kehidupan sendiri dan cita-cita sendiri. Perusahaan harus adil, kalau kerja lembur, berikanlah apresiasi yang sesuai. Berikan uang lembur, atau tambahkan jatah cutinya.

Sebagai penutup, saya menganggap perusahaan IT sama seperti klub sepakbola profesional, seperti Inter Milan atau Arsenal. Posisinya di klasemen, kekayaannya, jumlah fansnya, semua terutama ditentukan oleh siapa pelatihnya, dan siapa pemainnya. Tidak memperhatikan karyawan adalah langkah pertama menuju kegagalan.


Kandidat Java vs PHP

Disclaimer : kondisi dan pengalaman Anda SANGAT MUNGKIN BERBEDA. Jadi jangan bilang saya salah … ini pengalaman pribadi. Pengalaman Anda boleh saja berbeda, dan sangat dianjurkan untuk sharing.

Belakangan ini banyak yang nyari Programmer PHP yah :-d

Demikian tanggapan moderator milis JUG-Indonesia.

Saya mau sharing pengalaman sedikit tentang rekrutasi ArtiVisi beberapa hari yang lalu. Rate salary di lowongan kemarin itu 2-3 juta rupiah, looking for PHP Programmer.

Ternyata, dengan rate salary segitu, para kandidat sudah mampu ‘melaju ke babak playoff’. Begini maksudnya.

Kalau interview, saya selalu mengajukan pertanyaan yang makin lama makin sulit. Job seeker, perhatikan ini, Endy’s interview style.

  • Urusan coding standar. Percabangan dan perulangan.Misalnya:
    • tampilkan nama anda sebanyak jumlah hurufnya. Kalau namanya Endy, tampilkan endy endy endy endy. Kalau namanya Dhiku, tampilkan dhiku dhiku dhiku dhiku dhiku.
    • dengan input bulan dan tahun, buat function/method untuk menghitung jumlah harinya
  • Topik-topik populer
    • HTML syntax
    • Tableless layout with CSS
    • SQL Injection
  • Setelah itu masalah yang membutuhkan imajinasi, misalnya perbedaan pass by value dan pass by reference

  • Kalau masih lolos juga, matakuliah CS yang biasanya bikin ngantuk
    • Struktur Data
    • Algoritma tingkat menengah (tree, sorting, dsb)
    • Automata / Finite State Machine 5. Baru kemudian pertanyaan tentang wawasan
    • Primary Operating System, dan Secondary OS, yang biasa digunakan

Cuma pernah pakai Windows??? Hmm … terima kasih atas waktunya, nanti akan saya hubungi lagi. Tidak pernah pakai OS selain FreeBSD?? Hmm … menarik juga … mari kita tanya lebih lanjut,

Kamu sekolah TK di mana?

Saya pernah posting tentang kandidat ideal menurut saya di sini.

Lalu banyak yang berkomentar tentang betapa sulitnya persyaratan tersebut.

Nah …kembali ke pertanyaan Joshua … kenapa sekarang banyak cari PHP Programmer?

Well … berdasarkan pengalaman saya, dengan tawaran 2-3 juta, para kandidat programmer PHP ini umumnya mampu sampai pertanyaan 3. Beberapa ada yang bisa jawab sampai nomer 4. Belum ada yang sampai 5.

Bagaimana dengan koleganya, kandidat programmer Java? Menyedihkan …. Bahkan no 2 pun banyak yang gak bisa jawab. Fresh graduate Java programmer, berdasarkan survei yang tidak serius dan tidak bisa dipertanggungjawabkan metodologinya, apalagi hasilnya, menyatakan bahwa mereka mengharapkan gaji setidaknya 3-4 juta.

Jadi … kalau saya punya budget 3-4 juta, lalu buka lowongan, bandingkan apa yang akan saya peroleh.

** PHP Programmer **

  • Berpengalaman 2-3 tahun, sudah tahu sopan santun kerja di kantor
  • Bisa HTML
  • Bisa CSS, lengkap dengan div, span, bisa bikin table-less layout
  • Bisa AJAX, low level lagi pakai prototype.js atau whatever library JavaScript yang sedang trend
  • Ngerti konsep HTTP request-response, session, cookie, upload file, dan urusan remeh-temeh HTTP lainnya
  • Kalau beruntung, mungkin bisa dapat yang ngerti SOAP segala
  • Hey, 4 juta cukup mahal … coba kita lihat mungkin dia ngerti Photoshop juga :D

** Java Programmer **

  • Fresh graduate, masih bergaya mahasiswa
  • Ngerti HTML seadanya, belum tentu ngerti perilakunya frameset
  • Gak bisa CSS, apalagi table-less layout
  • Forget about AJAX
  • Forget about low-level HTTP, servlet mapping di web.xml aja belum tentu ngerti
  • SOAP?? Buat mandi??
  • Photoshop atau Corel Draw .. hmm .. itu kan kerjaannya Web Designer. Saya gak ikut-ikut.

Nah …. lalu apa pesan moral dari artikel ini?

  1. Freshmen Java harus lebih tahu diri. Kerjakan PR dulu baru apply. Dengan kondisi seperti di atas, saya lebih suka mempekerjakan PHP programmer lalu diajari Java
  2. Industri PHP harus lebih mengapresiasi komunitasnya
  3. Sebagai company-owner, harus tahu kondisi di berbagai dunia

Java Stack 2008

Di milis Java sedang dibahas tentang kombinasi teknologi yang digunakan untuk membuat aplikasi Java.

Ada beberapa kategori teknologi, yaitu:

  • Presentation Layer. Yaitu teknologi untuk membangun User Interface

  • Business Layer. Yaitu teknologi untuk menyediakan logika proses bisnis.

  • Data Access Layer. Yaitu teknologi untuk mengakses penyimpanan data, misalnya database.

  • Security Framework. Teknologi untuk mengelola otentikasi dan otorisasi.

  • Build System. Sistem untuk mengotomasi proses build.

  • Testing System. Sistem untuk mengotomasi pengetesan aplikasi.

  • Application Server

  • Database Server

  • Project Management Tools. Perangkat pembantu untuk mengelola project.

Berikut adalah stack yang saya gunakan, per Januari 2008. Sesuai perkembangan jaman, mungkin sekali stack ini akan berubah.

Presentation Layer

Tergantung tujuan developmentnya. Kalau butuh rapid, saya pakai JSF 1.2 dengan komponen RichFaces. Kalau ingin sederhana dan fleksibel, saya pakai Spring MVC.

Sebagai tambahan, sekarang saya sedang mengeksplorasi Spring Web Flow untuk mengelola state aplikasi. Framework ini bisa digunakan baik untuk JSF maupun Spring MVC.

Baik dalam Spring MVC maupun JSF,  kita dapat memilih View Engine yang digunakan. Kebanyakan orang tidak tahu, atau tidak mau repot, atau mungkin juga merasa nyaman menggunakan JSP. Tapi saya tidak. Saya lebih suka pakai Velocity atau Freemarker untuk Spring MVC, dan pakai Facelets di JSF.

Business Layer

Saya menggunakan Spring Framework untuk mengorkestrasi transaction, integrasi dengan berbagai data access layer, messaging system, dan sebagainya.

Data Access Layer

Bila ingin rapid development, saya pakai Hibernate. Bila ingin main low level SQL, saya pakai Spring JDBC.

Saya tidak pakai JPA. Dulu pernah pakai iBatis, tapi belakangan sepertinya sudah cukup dengan Spring JDBC saja.

Security Framework

Pakai Spring Security. Fiturnya cukup lengkap dan desainnya sudah teruji di skenario dunia nyata.

Build System

Orang-orang pada pakai Maven. Saya sudah merasa cukup pakai Ant saja.

Testing System

Saat ini pakai JUnit 4 dan DBUnit. Tapi sedang eksplorasi TestNG. Saya tertarik dengan kemampuan test-grouping. Ini penting apabila kita ingin memisahkan test yang harus dieksekusi programmer sebelum dia commit (sehingga harus cepat), dan test yang dieksekusi oleh tools Continuous Integration saja (karena butuh waktu lama).

Test sebelum commit contohnya adalah unit test dan integration test. Selain itu, ada test yang butuh waktu lama, misalnya test End of Day/Month/Year process, dan test simulasi kinerja aplikasi dengan data satu tahun kedepan.

Untuk coverage test, saya gunakan Cobertura. Sedangkan untuk Static Code Analysis saya gunakan PMD.

Ke depan, saya sedang menganalisa efektifitas penggunakan JDepend untuk memastikan dependensi antar modul yang sudah ditentukan di awal tidak dilanggar programmer lain. Misalnya, tidak ada urusannya presentation layer melakukan import HibernateException. Nah, ini sepertinya bisa dienforce oleh JDepend, tapi belum sempat saya coba.

Application Server

Saya gunakan Winstone untuk tutorial dan pelatihan. Untuk development saya gunakan Tomcat. Untuk production saya gunakan Glassfish.

Database Server

Untuk development dan production, saya menggunakan PostgreSQL. Untuk pelatihan dan tutorial, saya gunakan MySQL.

Project Management Tools

Untuk melakukan tracking terhadap:

  • implementasi fitur

  • resiko dalam project

  • masalah dalam project

  • penyelesaian bug

  • perbaikan dokumen berdasarkan review/audit

saya menggunakan Redmine.

Untuk membantu proses Configuration Management, saya menggunakan Subversion. Kadang-kadang dibantu dengan SVK bila ingin kerja offline.

Sebelum saya tutup artikel ini, pasti nanti ada yang ingin berkomentar seperti ini,

Wuah, banyak sekali persenjataannya. Kok repot-repot sekali sih?

Di sebelah rumah saya, tetangga sedang membangun rumah. Para pekerjanya (2-3 orang) cukup bermodalkan cangkul untuk mengaduk semen. Bila mereka ingin mengecor lantai dua, cukup membuat bekisting dari triplek dan papan bekas, yang setelah pakai bisa langsung dibuang. Sekali-sekali, saya melihat mereka menggotong perkakas dan bahan baku bila lokasi kerjanya pindah.

Di depan jendela saya di kantor, sedang dibangun gedung perkantoran yang baru. Untuk mengaduk semen, tidak pakai cangkul, melainkan dituang dari truk molen. Tim pekerjanya (200-300 orang) punya cetakan/bekisting khusus yang reusable untuk mengecor tiang dan lantai. Bila ada perkakas atau bahan baku yang perlu dipindahkan, mereka tidak gotong sendiri. Untuk keperluan itu, ada alat sendiri yang namanya tower crane. Bahkan ada pilotnya khusus.

Nah, itu analoginya. Silahkan simpulkan sendiri, kenapa harus repot-repot.


Aplikasi Web dengan Spring 2.5 [bagian 6]

Pada artikel kali ini, kita akan mengurusi masalah sepele tapi penting, yaitu Internationalization (i18n) dan Localization (l10n). i18n adalah menyiapkan aplikasi kita supaya bisa beradaptasi dengan berbagai bahasa, format penomoran, mata uang, dan hal-hal lain yang berkaitan dengan globalisasi.

Para pembaca mungkin ada yang bertanya,

Ah, aplikasi saya tidak perlu multibahasa kok. Saya bikin dalam bahasa Inggris, dan tidak akan diubah-ubah lagi.

Baiklah, mungkin aplikasi kita tidak akan berganti bahasa. Tapi mungkin sekali akan terjadi banyak revisi tampilan. Kita sebagai programmer mungkin mahir berbahasa PHP, Java, Ruby, atau bahasa-bahasa komputer lainnya. Tetapi belum tentu kita dapat menyaingi seorang JS Badudu dalam urusan Bahasa Indonesia.

Oleh karena itu, penting untuk menyiapkan aplikasi kita agar setidaknya tulisan yang dilihat user bisa diganti dengan mudah.

Mari kita lihat template sederhana berikut.

personlist.html

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>:: List of All Person ::</title>
</head>
<body>

<h1>List of All Person</h1>

<table border="0" cellpadding="2" cellspacing="2">
	<tr>
		<th>Name</th>
		<th>Email</th>
		<th> </th>
	</tr>
	#foreach($person in $personList)
	<tr>
		<td>$person.Name</td>
		<td>$person.Email</td>
		<td><a href="personform?person_id=$person.Id">edit</a> | <a
		 href="persondetail?person_id=$person.Id">view</a></td>
	</tr>
	#end
</table>

</body>
</html>

Seperti kita lihat, ada beberapa tulisan yang muncul di situ, yaitu:

  • Judul halaman
  • Nama kolom pada tabel : Nama, Email
  • link untuk edit dan lihat

Spring sudah memiliki dukungan built-in untuk mengeluarkan tulisan tersebut ke file text. Nantinya kita bisa edit file tersebut dengan mudah. Kita juga bisa punya beberapa file dalam berbagai bahasa, sehingga aplikasi dapat mendeteksi setting regional komputer, dan kemudian menampilkan bahasa yang sesuai.

Tapi untuk artikel ini, cukuplah kita mengeluarkan tulisan itu ke file text. Fitur-fitur tambahan lainnya silahkan dieksplorasi sendiri oleh pembaca.

Kita menggunakan tag #springMessage untuk mengeluarkan tulisan tersebut. Tag ini khusus untuk Velocity. Bila Anda menggunakan JSP atau Freemarker, silahkan lihat referensi Spring.

Template yang sudah diubah terlihat menjadi seperti ini.

personlist.html

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>:: #springMessage("personlist.title") ::</title>
</head>
<body>

<h1>#springMessage("personlist.title")</h1>

<table border="0" cellpadding="2" cellspacing="2">
	<tr>
		<th>#springMessage("personlist.name")</th>
		<th>#springMessage("personlist.email")</th>
		<th> </th>
	</tr>
	#foreach($person in $personList)
	<tr>
		<td>$person.Name</td>
		<td>$person.Email</td>
		<td><a href="personform?person_id=$person.Id">#springMessage("list.edit")</a> | <a
		 href="persondetail?person_id=$person.Id">#springMessage("list.view")</a></td>
	</tr>
	#end
</table>

</body>
</html>

Tag #springMessage membutuhkan satu argumen, yaitu nama yang kita berikan untuk tulisan tersebut. Ini akan menjadi jelas setelah kita lihat file text yang menampung tulisan tersebut, misalnya saya beri nama messages.properties.

messages.properties

list.edit = edit
list.view = lihat

personlist.title = Daftar Orang
personlist.name = Nama
personlist.email = Alamat Email

Setelah file tersebut siap, kita konfigurasi Spring agar membaca file tersebut. Lokasi konfigurasinya ada di tutorial-servlet.xml. Berikut isinya.

tutorial-servlet.xml

<bean id="messageSource"
      class="org.springframework.context.support.ResourceBundleMessageSource"
      p:basename="messages" />

Nah, silahkan deploy ulang aplikasinya. Sekarang semua tulisan yang tampil sudah bisa dikonfigurasi melalui text file.

Selanjutnya, bagaimana mengakses file tulisan tersebut dari kode Java? Kita membutuhkannya untuk menampilkan pesan error dari hasil import data.

Mudah saja, langsung saja gunakan object messageSource yang sudah kita deklarasikan tadi. Kita dapat mendapatkan object tersebut dengan menggunakan dependency injection. Berikut adalah kode PersonCSVParser yang akan menggunakan messageSource.

PersonCSVParser.java

package tutorial.spring25.helper;

@Component
public class PersonCSVParser {
    private MessageSource messageSource;

    @Autowired(required=true)
    public void setMessageSource(MessageSource messageSource) {
        this.messageSource = messageSource;
    }

    @SuppressWarnings("unchecked")
    public void parse(List<String> data, List<Person> result, List<ParseError> errors) {

        -- snip --

        // check for malformed data
        if(tokenizer.countTokens() != PERSON_NUM_FIELDS) {
            errors.add(new ParseError(
                counter, text,
                messageSource.getMessage(
                    "parseerror.reason.malformed",
                    new Object[]{2,tokenizer.countTokens()},
                    Locale.getDefault()
                )
            ));
        }

        -- snip --

        if(bindErrors.hasErrors()) {
            List<ObjectError> bindErrorContent = bindErrors.getAllErrors();

            for (ObjectError objectError : bindErrorContent) {
                errors.add(new ParseError(
                    counter, text,
                    messageSource.getMessage(
                        objectError.getCode(),
                        objectError.getArguments(),
                        Locale.getDefault()
                    )
                ));
            }
        }

        result.add(person);
    }
}

Nah, mudah bukan? Karena itu, dari hari pertama coding, langsung saja siapkan aplikasi Anda untuk i18n.