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]

Reply via email to