Google App Engine for JavaのHttpServletResponseWrapperの注意

GAE/Jというか、Jettyの挙動なのだけど。
たとえば、出力内容を一旦キャッシュしておきたいときやフィルターで加工するとき、HttpServletResponseWrapperに書き出してキャッシュしたり加工したりする。
で、TomcatならこんなコードでServletResponseを書けばよかった。

final StringWriter sw = new StringWriter();

ServletResponse res = new HttpServletResponseWrapper(response){
    @Override
    public PrintWriter getWriter() throws IOException {
        return new PrintWriter(sw);
    }
};


ところが、Jettyではこのままでは一度getOutputStreamが呼び出されてしまうらしく、実際に出力するためにresponseからgetWriterなどするときに怒られてしまう。
ということで、getOutputStreamが仮のオブジェクトを返すようにしておく。nullを返すとそれはそれで怒られるので、ServletOutputStreamとしてみなせるだけの最低限のことを書いておく。

final StringWriter sw = new StringWriter();

ServletResponse res = new HttpServletResponseWrapper(response){
    @Override
    public PrintWriter getWriter() throws IOException {
        return new PrintWriter(sw);
    }

    @Override
    public ServletOutputStream getOutputStream() throws IOException {
        return new ServletOutputStream() {
            @Override
            public void write(int b) throws IOException {
            }
        };
    }
};