Wicketで、ResponseからOutputStreamを取り出せるのはWebApplicationからgetHomePageしたクラスだけっぽい?
Wicketやっててちょっとつまづいたんだが、
ROME使ってRSSを作る時、最終的にはWebPage#onRenderで
@Override
protected void onRender(MarkupStream markupStream) {
Response resp = this.getResponse();
resp.setContentType("application/xml; charset=UTF-8");
PrintWriter pw = new PrintWriter(resp.getOutputStream());
SyndFeedOutput sfo = new SyndFeedOutput();
try {
sfo.output(this.getFeed(), pw);
} catch (IOException e) {
throw new RuntimeException("Error Streaming Feed",e);
} catch (FeedException e) {
throw new RuntimeException("Error Streaming Feed",e);
}
}
protected void onRender(MarkupStream markupStream) {
Response resp = this.getResponse();
resp.setContentType("application/xml; charset=UTF-8");
PrintWriter pw = new PrintWriter(resp.getOutputStream());
SyndFeedOutput sfo = new SyndFeedOutput();
try {
sfo.output(this.getFeed(), pw);
} catch (IOException e) {
throw new RuntimeException("Error Streaming Feed",e);
} catch (FeedException e) {
throw new RuntimeException("Error Streaming Feed",e);
}
}
ってしてたんだが、これだと不味いっぽい事に気づいてきた。
どうも、WicketApplicationの子クラス(Wicketで最初に呼ばれる奴)の、
getHomePageの戻り値として渡されるWebPageの子クラス(以降、トップページと呼ぶ)しか、これが出来ないっぽい。
どうも、
Response resp = this.getResponse();
で戻ってくるクラスが違うらしく、しかも、トップページ以外のページ、例えば
/* HomePage.javaコンストラクタ内 */
this.add(new PageLink("LinkPage",LinkedPage.class));
this.add(new PageLink("LinkPage",LinkedPage.class));
みたいにしてリンクされるページ(以降リンク先ページ)で得られるResponseの実クラスが、
何とgetOutputStream()をサポートしていない、
BufferedHttpServletResponseなるクラスらしいのだ。
ちなみに、トップページの時はWebResponse が戻ってくる模様。
実際にソースを見ると、以下のようになっている。
- WebResponse.java
-
/**
* @see org.apache.wicket.Response#getOutputStream()
*/
@Override
public OutputStream getOutputStream()
{
try
{
return httpServletResponse.getOutputStream();
}
catch (IOException e)
{
throw new WicketRuntimeException("Error while getting output stream.", e);
}
} - BufferedHttpServletResponse
-
/**
* @see javax.servlet.ServletResponse#getOutputStream()
*/
public ServletOutputStream getOutputStream() throws IOException
{
throw new UnsupportedOperationException("Cannot get output stream on BufferedResponse");
}
ソース上でも、はっきりとサポート外の例外を投げるようになっている。
これはいったい何の嫌がらせなのだろうか?
原因は、多分WebRequestCycle#redirectToと思われる。
しかし、ROME側はこれを受け入れているのか?
それとも、他に簡単な出力方法があるから無視しているのだろうか?
出力にはROMEを使わず、ListViewを使えと言うことか?
- ページ:
- 1
- 2




