Saturday, August 12, 2006

消える例外?

Java、Web、Struts(1.0.2)の話です。

Struts(1.0.2)をフレームワークとして使用したWebアプリケーションで
例外が発生するがその原因がわからない、という事がありました。

ソースコードを見ると、Strutsが呼び出したクラスで例外が発生した場合、
Struts側は、それをStrutsの例外として投げ直すのですが、
そのStrutsの例外クラスは、元の例外をラップしていないようです。
元の例外はページコンテキストにセットされるようです。

jakarta-struts-1.0.2-src/src/share/org/apache/struts/util/RequestUtils.java
の517行目付近


// Locate and return the specified property
try {
return (PropertyUtils.getProperty(bean, property));
} catch (IllegalAccessException e) {
saveException(pageContext, e);
throw new JspException
(messages.getMessage("lookup.access", property, name));
} catch (InvocationTargetException e) {
Throwable t = e.getTargetException();
if (t == null)
t = e;
saveException(pageContext, t);
throw new JspException
(messages.getMessage("lookup.target", property, name));
} catch (NoSuchMethodException e) {
saveException(pageContext, e);
throw new JspException
(messages.getMessage("lookup.method", property, name));
}

}


jakarta-struts-1.0.2-src/src/share/org/apache/struts/util/RequestUtils.java
の916行目付近


/**
* Save the specified exception as a request attribute for later use.
*
* @param pageContext The PageContext for the current page
* @param exception The exception to be saved
*/
public static void saveException(PageContext pageContext,
Throwable exception) {

pageContext.setAttribute(Action.EXCEPTION_KEY, exception,
PageContext.REQUEST_SCOPE);

}



こういうのもあって、なかなか大元の例外が見つからなくて、ちょっとはまりました。