Play!のSecureモジュールでエラーとなる

Play frameworkのチュートリアルも中盤にさしかかってきましたが、認証の追加でログイン画面からログインが正常にできないという状況に直面しました。

※Play Framework1.2.4/JDK1.7を利用しています。

secureモジュールを有効化し、adminコントローラーにログイン認証を行うよう設定を行います。その後、adminコントローラー(http://localhost:9000/admin)を表示すると下記の通りログイン画面が表示されるようになります。

secure_error

チュートリアルでは、ログイン認証は制限が掛かっていないので任意のユーザー名/パスワードの組み合わせでログインができる旨の説明があり、実際にSecure#authenticateもTrueを返すだけになっています。

とりあえず、適当なユーザー名とパスワードを入力してSign inボタンをクリックするとエラーが表示されます。

secure_error2

少しSecure.javaのソースを読んだのですが、try-catch句で発生している内容ですが、発生している例外が拾われていない位はぱっとわかりました。

チュートリアルで例外が発生した場合、同じようなことで困っている人もいそうなものだと思いつつGoogleで検索したところ下記のエントリが見つかりました。

playframework - VerifyError; Expecting a stack map frame in method controllers.Secure$Security.authentify - Stack Overflow http://stackoverflow.com/questions/6704169/verifyerror-expecting-a-stack-map-frame-in-method-controllers-securesecurity-a

どうも海外でも同じような問題が話題になっていたようです。

こちらのエントリでは、JDK1.7に起因する問題と言うことで下記の対応で解決できるとのことでした。

  1. application.conf に以下の設定を追加する。
    [sourcecode language="java"] # VerifyError; Expecting a stack map frame in method controllers.Secure$Security.authentify java.source=1.6 [/sourcecode]
  2. アプリケーションを停止してtempフォルダ内のファイルをすべて削除する。

どうも、

the latest release candidate of 1.2.4 had some changes to make it Java 5 backward compatible. As a result this may have re-introduced this error. 1.3.x will not support Java 5, so I would expect this error to go away again in 1.3.x. – Codemwnci Jun 5 at 11:41

ということから、1.2.4でのJava5互換の変更が影響しているようですね。ただ、将来リリースされる1.3以降ではJava5をサポートしないから解決するのではとのことです。

JDKのバージョンでなぜ挙動が違うのかはちょっとわかりませんが、そのうち確認してみたいですね。