Menangani Exception Di Spring Web Flow


Kesalahan selalu dapat terjadi dalam setiap kondisi.  Sebuah aplikasi yang baik harus dapat mempersiapkan diri terhadap kesalahan.  Di Java, kesalahan selalu diwakili melalui sebuah class yang diturunkan dari java.lang.Exception.   Sebagai contoh, untuk operasi penyimpanan domain object Pemesanan, saya bisa membuat beberapa class Exception seperti ItemTidakTersedia, LewatDariBatasWaktu, atau TerlaluBanyakHutang🙂   Setiap kali penyimpanan dilakukan, bila ada “kesalahan”, saya akan men-throw salah satu dari Exception di atas.

Seandainya saya memakai Spring Web Flow untuk mengelola aliran view di web front end, maka bila terdapat Exception, saya seharusnya tidak boleh lanjut ke state berikutnya (alur normal).   Tapi bila saya hanya sekedar men-throw Exception, Spring Web Flow akan menampilkan halaman stack trace HTTP Status 500 yang penuh kode program.  Seharusnya pengguna tidak perlu melihat halaman ini. Lalu, apa yang harus saya lakukan agar bila terjadi Exception, Spring Web Flow akan kembali ke halaman yang sama, tetapi dengan menampilkan pesan kesalahan yang mudah dipahami pengguna?

Berikut ini adalah contoh isi definisi flow untuk pemesanan saya:

...
<view-state id="konfirmasiPemesanan" view="pemesanan/konfirmasi" model="pemesanan">
  <transition on="prosesPemesanan" to="selesai">
    <evaluate expression="pemesananController.simpanPemesanan(flowScope.pemesanan, messageContext)" />
  </transition>
  <transition on="kembali" to="isiDataPemesanan" />
  <transition on="batalkanPemesanan" to="batal" bind="false" />
</view-state>

<end-state id="selesai" view="pemesanan/selesai">
  <output name="pemesanan" />
</end-state>

<end-state id="batal" view="redirect:/" />

Jika terjadi event “prosesPemesanan” (yang dipicu oleh sebuah tombol di view)  di view konfirmasiPemesanan, maka method simpanPemesanan di pemesananController akan dikerjakan.  Pada method inilah ada kemungkinan Exception di-throw.   Yang harus saya lakukan adalah menentukan pesan kesalahan yang akan ditampilkan bila sebuah Exception terjadi melalui MessageContext.  Selain itu, saya harus mengembalikan sebuah Event sehingga Spring Web Flow dapat membedakan apakah telah terjadi kesalahan atau tidak.  Berikut ini adalah contoh isi method simpanPemesanan yang saya buat:

public Event simpanPemesanan(Pemesanan pemesanan, MessageContext messageContext) {
  try {
    pemesananService.simpanPemesanan(pemesanan);
  } catch (ItemTidakTersedia ex) {
    messageContext.addMessage(new MessageBuilder().error().defaultText("Tunggu 3 hari lagi ya!"));
    return new EventFactorySupport().error(this);
  } catch (LewatDariBatasWaktu ex) {
    messageContext.addMessage(new MessageBuilder().error().defaultText("Kami tidak melayani yang beginian!"));
    return new EventFactorySupport().error(this);
  } catch (TerlaluBanyakHutang ex) {
    messageContext.addMessage(new MessageBuilder().error().defaultText("Maaf, Anda terlalu banyak hutang!"));
    return new EventFactorySupport().error(this);
  }
  return new EventFactorySupport().success(this);
}

Sekarang, jika terjadi kesalahan, maka Spring Web Flow akan memperbaharui halaman yang sama dengan yang sedang ditampilkan yaitu view pemesanan/konfirmasi.  Bedanya adalah bila terjadi kesalahan, messageContext akan berisi pesan kesalahan yang saya buat di atas.  Lalu bagaimana cara menampilkan pesan kesalahan di messageContext?  Saya bisa memakai Spring Web MVC tags seperti pada contoh berikut ini di halaman JSP yang mewakili view:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<div xmlns:jsp="http://java.sun.com/JSP/page"
     xmlns:form="http://www.springframework.org/tags/form">
...
<form:form id="frmUtama" action="${flowExecutionUrl}" modelAttribute="pemesanan">
  <div id="pesanKesalahan"><form:error /></div>
  ...
</form:form>
...
</div>

Pada contoh di atas, tag <form:error> akan menampilkan pesan kesalahan di messageContext bila seandainya terdapat pesan kesalahan.

Perihal Solid Snake
I'm nothing...

One Response to Menangani Exception Di Spring Web Flow

  1. Ping-balik: Menangani Exception Di Spring Web Flow – Dengan Berpindah View « The Solid Snake

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: