java.lang.IllegalStateException: getOutputStream() has already been called for t his response


Kesalahan atau exception tersebut selalu saya peroleh ketika dari servlet yang saya buat mengembalikan sebuah dokumen SWF. Potongan program servlet yang saya gunakan untuk mengembalikan dokumen SWF adalah sebagai berikut :

response.setContentType("application/x-shockwave-flash");
response.setContentLength(baos.size());
response.setHeader("Content-Disposition", "inline; filename=\"test.swf\"");

ServletOutputStream outs = response.getOutputStream();
baos.writeTo(outs);
outs.flush();

baos adalah objek bertipe ByteArrayOutputStream.

Sayapun akhirnya menjelajah ke forum-forum yang ada, sampai akhirnya saya menemukan sedikit pencerahan untuk mengubah urutan baris programnya sebagai berikut :

ServletOutputStream outs = response.getOutputStream();
response.reset();
response.setContentType("application/x-shockwave-flash");
response.setContentLength(baos.size());
response.setHeader("Content-Disposition", "inline; filename=\"test.swf\"");

baos.writeTo(outs);
outs.flush();
outs.close();

Jadi ternyata, pemanggilan getOutputStream() sebaiknya dilakukan sebelum pengiriman header HTTP dan isi dari file yang akan kita kirim ke client. Metode reset() kita panggil untuk memastikan servlet membersihkan buffer sekaligus kondisi buffer saat ini. Jika saat reset() di jalankan, dan ternyata buffer response sudah dalam keadaan ter-commit, maka J2EE akan mengembalikan kesalahan IllegalStateException. Agak membingungkan memang. Dan semoga dengan perubahan ini tidak sesering mengembalikan kesalahan seperti pada judul saya di atas.