[Seasar-user:5529] [S2JSF+Teeda] 記法エラー発生後、アプリケーションに一切アクセスできなくなる

Kaisei HAMAMOTO [E-MAIL ADDRESS DELETED]
2006年 12月 19日 (火) 18:35:12 JST


浜本です。お世話になっております。

S2JSF1.1.0 + Teeda1.0.2 を試用中ですが、以下のような問題が発生します。

【症状】
HTML ファイルの記法の誤りにより、一度 HTTP ステータス 500 エラーが
発生すると、それ以降のリクエスト時に下記の例外が一様に発生し、
アプリケーションに全くアクセスできなくなる場合がある。

java.lang.IllegalStateException: already released
org.seasar.teeda.core.context.servlet.ServletFacesContextImpl.assertNotReleased
(ServletFacesContextImpl.java:225)
org.seasar.teeda.core.context.servlet.ServletFacesContextImpl.getResponseWriter
(ServletFacesContextImpl.java:161)
javax.faces.webapp.UIComponentTag.setupResponseWriter(UIComponentTag.java:351)
javax.faces.webapp.UIComponentTag.doStartTag(UIComponentTag.java:127)
org.seasar.jsf.processor.TagProcessorImpl.processTag(TagProcessorImpl.java:224)
org.seasar.jsf.processor.TagProcessorImpl.process(TagProcessorImpl.java:217)
org.seasar.jsf.processor.ElementProcessor.process(ElementProcessor.java:93)
org.seasar.jsf.processor.TagProcessorImpl.processChildren(TagProcessorImpl.java:269)
org.seasar.jsf.processor.TagProcessorImpl.processBodyTag(TagProcessorImpl.java:243)
org.seasar.jsf.processor.TagProcessorImpl.process(TagProcessorImpl.java:213)
org.seasar.jsf.processor.TagProcessorImpl.process(TagProcessorImpl.java:196)
org.seasar.jsf.processor.ViewProcessor.process(ViewProcessor.java:174)
org.seasar.jsf.processor.ViewProcessor.process(ViewProcessor.java:172)
org.seasar.jsf.runtime.ViewRendererImpl.renderView(ViewRendererImpl.java:102)
org.seasar.jsf.application.S2ViewHandler.renderView(S2ViewHandler.java:123)
org.seasar.jsf.lifecycle.LifecycleImpl.render(LifecycleImpl.java:197)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:103)
examples.jsf.util.RequestDumpFilter.doFilter(RequestDumpFilter.java:66)
org.seasar.extension.filter.EncodingFilter.doFilter(EncodingFilter.java:62)
org.seasar.framework.container.filter.S2ContainerFilter.doFilter(S2ContainerFilter.java:63)
org.apache.myfaces.component.html.util.ExtensionsFilter.doFilter(ExtensionsFilter.java:122)

【再現例】
1. s2jsf-example 1.1.0 を起動する。
2. /src/main/webapp/WEB-INF/layout/header.html をエディタで開き、
<span m:inject="s:insert"> の記述を削除する(意図的にミスを作成)。
3. ブラウザからアプリケーションにアクセスすると、
org.seasar.jsf.exception.InsertProcessorNotFoundRuntimeException
が発生する。
4. /src/main/webapp/WEB-INF/layout/header.html の記述を元に戻す。
5. アプリケーションに再度アクセスすると、今度は
java.lang.IllegalStateException: already released が発生する。
6. 以降、全てのアクセスに対して同じ例外が発生する。

【解決策?】
Teeda のソースを追ったところ、javax.faces.webapp.UIComponentTag#release() に
解放漏れがあるように思えました。メソッドを以下のように変更すると問題が発生
しなくなりましたが、正しい解決策かどうかは分かりません。

public void release() {
    parent = null;
    binding = null;
    id = null;
    created = false;
    rendered = null;
    // **************** 追加ここから
    component = null;
    context = null;
    createdComponents = null;
    createdFacets = null;
    pageContext = null;
    // **************** 追加ここまで
}

以上、よろしくお願いいたします。



Seasar-user メーリングリストの案内