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 { } }; } };