Hi, I have submitted this to user list a few hours ago but finally, I found the root cause of this issue. So, here I report it to dev list. If an exception is thrown while OGNL expression evaluation such as in the following scenario:
XXXAction public String getMessage() { throw new NullPointerException(); } XXX.jsp <s:property value="message"/> The exception is wrapped in an OgnlException and re-thrown. It is caught in com.opensymphony.xwork2.util.CompoundRootAccessor.getProperty() and wrapped in a XWorkException() and re-thrown. } catch (OgnlException e) { if (e.getReason() != null) { final String msg = "Caught an Ognl exception while getting property " + name; throw new XWorkException(msg, e); } } catch (IntrospectionException e) { Finally, it is caught in com.opensymphony.xwork2.util.OgnlValueStack.findValue(String, Class) and swallowed. } catch (Exception e) { logLookupFailure(expr, e); return findInContext(expr); } finally { As a result, the upper layer does not receive any exception. So, no exception handler is invoked even if it is registered. Moreover, in 'open session in view' pattern, since the upper layer are not notified any error, the transaction is wrongly committed and it causes serious problem. I tried to add a catch clause for RuntimeException: } catch (RuntimeException e) { logLookupFailure(expr, e); throw e; } catch (Exception e) { logLookupFailure(expr, e); return findInContext(expr); } finally { Yes, the exception is successfully thrown to the upper layer with this code change. However, Struts shows 'java.io.IOException: Stream closed:' on the browser. This message seems a bit confusing. and difficult to realize what is actually happening (NPE is thrown). Does anybody have better solution on this? Thanks, -- Ruimo Uno (Shisei Hanai) --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]