Wicketで、ResponseからOutputStreamを取り出せるのはWebApplicationからgetHomePageしたクラスだけっぽい?

Wicketやっててちょっとつまづいたんだが、
ROME使ってRSSを作る時、最終的にはWebPage#onRender

  1. @Override
  2. protected void onRender(MarkupStream markupStream) {
  3.     Response resp = this.getResponse();
  4.     resp.setContentType("application/xml; charset=UTF-8");
  5.     PrintWriter pw = new PrintWriter(resp.getOutputStream());
  6.     SyndFeedOutput sfo = new SyndFeedOutput();
  7.     try {
  8.         sfo.output(this.getFeed(), pw);
  9.     } catch (IOException e) {
  10.         throw new RuntimeException("Error Streaming Feed",e);
  11.     } catch (FeedException e) {
  12.         throw new RuntimeException("Error Streaming Feed",e);
  13.     }
  14. }

ってしてたんだが、これだと不味いっぽい事に気づいてきた。
どうも、WicketApplicationの子クラス(Wicketで最初に呼ばれる奴)の、
getHomePageの戻り値として渡されるWebPageの子クラス(以降、トップページと呼ぶ)しか、これが出来ないっぽい。
どうも、

  1. Response resp = this.getResponse();

で戻ってくるクラスが違うらしく、しかも、トップページ以外のページ、例えば

  1. <!--HomePage.html-->
  2. <a wicket:id="LinkPage">リンクしまーす</a>
  1. /* HomePage.javaコンストラクタ内 */
  2. this.add(new PageLink("LinkPage",LinkedPage.class));

みたいにしてリンクされるページ(以降リンク先ページ)で得られるResponseの実クラスが、
何とgetOutputStream()をサポートしていない、
BufferedHttpServletResponseなるクラスらしいのだ。
ちなみに、トップページの時はWebResponse が戻ってくる模様。

実際にソースを見ると、以下のようになっている。

WebResponse.java
  1. /**
  2.  * @see org.apache.wicket.Response#getOutputStream()
  3.  */
  4. @Override
  5. public OutputStream getOutputStream()
  6. {
  7.     try
  8.     {
  9.         return httpServletResponse.getOutputStream();
  10.     }
  11.     catch (IOException e)
  12.     {
  13.         throw new WicketRuntimeException("Error while getting output stream.", e);
  14.     }
  15. }
BufferedHttpServletResponse
  1. /**
  2.  * @see javax.servlet.ServletResponse#getOutputStream()
  3.  */
  4. public ServletOutputStream getOutputStream() throws IOException
  5. {
  6.     throw new UnsupportedOperationException("Cannot get output stream on BufferedResponse");
  7. }

ソース上でも、はっきりとサポート外の例外を投げるようになっている。

これはいったい何の嫌がらせなのだろうか?
原因は、多分WebRequestCycle#redirectToと思われる。
しかし、ROME側はこれを受け入れているのか?
それとも、他に簡単な出力方法があるから無視しているのだろうか?
出力にはROMEを使わず、ListViewを使えと言うことか?

タイトルとURLをコピーしました