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

このエントリをはてなブックマークに追加このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加このエントリをkwoutに追加
2009年5月4日 月曜日2:40:37

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

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

Response resp = this.getResponse();

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

<!--HomePage.html-->
<a wicket:id="LinkPage">リンクしまーす</a>

/* HomePage.javaコンストラクタ内 */
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

TrackBack URL :

コメントする

HTML convert time: 0.967 sec.