今日というか、昨日からハマっていたのだが。
JSFでは、ExternalContext.getRequestCookieMap()を呼び出すことで、リクエストに送られたCookieを取り出すことが出来る。で、これを使ってみたのだが、何やらClassCastExceptionが出る。てっきりここで返されるMapが、Map<String, Cookie>だと思っていたので、実はMap<String, String>が返されている事になかなか気づかず、かなり悩んでしまった。まぁ、分かってみれば単純だ。JDK5.0だから、何かGenericsに罠があるかもとか勘ぐったのも良くなかった。
で、なんでまた、こんな勘違いをしたのか。もしかしてJSFのAPI仕様書が曖昧な書き方をしてるんだろうか。と思って調べてみる。
Return an immutable Map whose keys are the set of cookie names included in the current request, and whose values (of type javax.servlet.http.Cookie) are the first (or only) cookie for each cookie name returned by the underlying request. The returned Map must implement the entire contract for an unmodifiable map as described in the JavaDocs for java.util.Map.
ん〜。明確に値の方の型はCookieって書いてあるな〜。ってちょっと待て!悪いのはMyFacesじゃないか! また、CookieMapクラスのバグか。
というわけで、本日のバグ報告。
なんで、こんなバグが残ってるんだろう。みんなExternalContext.getRequestCookieMap()なんて使ってないのか? getRequest()で、リクエストオブジェクトとって、ガリガリやってるの?
まぁ、そもそもCookieは仕様上同名のものが存在する事が許されているわけで、それをMapに入れようなんて時点でデザインが破綻しているとは思うが。
HOME