最近遇到一个问题,觉得挺有意思。
现在正在将一个项目从web service 转到 EJB2 (是否觉得很奇怪?),转移过程中出现了一些问题。其中一个exception如下:
java.lang.IllegalStateException: response already committed
当时第一个反应是可能页面 forward跳转或者buffer size不够了。因为我们用的是公司自己开发的web framework。所以所有的request flow control 都是封装起来了。xml配置文件之前在webservice下是可以的,页面也一直没有问题。
在网上google了一下,陈述的观点无非是response已经commit过了,也许是因为人为,也许是因为页面大小超过了page的buffer。于是乎尝试用response.setBufferSize()修改page大小,但没有效果。由于第一次遇到这样的问题,而且用的是websphere的portal和公司的framework,所以一开始找不到头绪。
确定是jsp页面的问题后,开始用最笨的方法,尝试着删减页面的代码,最后问题出在了一句代码。
HashMap map = xxxResultBean.getResultMap();
原来这个method返回的是一个TreeMap,用HashMap来reference就出现了casting的问题。由于这个Bean里面定义的field是Map,所以complie是不会有问题,直到page真的load的时候才会crash。
但问题来了,为什么之前在web service的时候没有问题,但到了EJB就不行了呢?原来在web service和EJB的时候,对class的定义会有所不同,EJB比较遵从原来的class,而web service则不太一样。
一个小问题,用最笨的方法detect。