Slim3+MobyletでHTMLが複数回出力されるときの対処法

Slim3Mobyletを組み合わせた場合、なぜかProduction環境でだけ、HTMLが複数回出力される(の後にまたが始まる)ことがあります。

バージョン

Slim3 : 1.0.5
Mobylet : 1.0.6

対応方法

web.xmlのフィルタ対象いじって直ったと思いきや、Slim3のAppRouterが効かなくなったりして紆余曲折あるのですが、
結論としては、以下のコードで直りました。

import javax.servlet.http.HttpServletResponse;

import org.mobylet.core.dialect.MobyletDialect;
import org.mobylet.core.http.MobyletFilter;
import org.mobylet.core.http.MobyletResponse;

public class MobyletFilterWrapper extends MobyletFilter {
    
    protected MobyletResponse wrapResponse(
            HttpServletResponse response, MobyletDialect dialect) {
        return new MobyletResponseWrapper(response, dialect);
    }

}

web.xmlのMobyletFilterの実体を上記クラスに変更します。

import java.io.IOException;

import javax.servlet.http.HttpServletResponse;

import org.mobylet.core.dialect.MobyletDialect;
import org.mobylet.core.http.MobyletResponse;

public class MobyletResponseWrapper extends MobyletResponse {

    public MobyletResponseWrapper(HttpServletResponse response,
            MobyletDialect dialect) {
        super(response, dialect);
    }

    public void flushByMobylet() throws IOException {
        super.flushByMobylet();
        if (this.printWriter != null) {
            this.printWriter.close();
        }
    }
}

現象としては、MobyletResponse#flushByMobylet() が複数回実行されて、
MobyletResponseの持つPrintWriterがclose()されていない為に発生しているようなので、
拡張したクラスで明示的にclose()してあげます。

まとめ?

複数回呼ばれる事が間違っているのか、closeしてないのが間違っているのか、
そもそも、どうしてProductionでしか発生しないのか、全然わかりませんがw
ともかく、上記のようにPrintWriter#flush()後にcloseして上げる事で直りました。
これでしばらく様子をみたいと思います。