Promise は成功バイアスであり、そのすべての操作について、エラーではなく実際に値が含まれていると想定します。get
変換されていないエラーを含む promise を呼び出そうとすると、例外が発生します。
必要なのは、Promise が成功かエラーかを判断することです。たとえば、パターン マッチングを使用してそれを行うことができます。
このコードを試してください:
AsyncResult(
OpenID.verifiedId.extend1( _ match {
case Redeemed(info) => Ok(info.attributes.get("email").getOrElse("no email in valid response"))
case Thrown(throwable) => {
Logger.error("openid callback error",throwable)
Unauthorized
}
}
)
)
将来と約束についてもっと読みたいと思うかもしれません。私はこの素晴らしい記事をお勧めします:
http://danielwestheide.com/blog/2013/01/09/the-neophytes-guide-to-scala-part-8-welcome-to -the-future.html
編集:Javaでドキュメント(http://www.playframework.com/documentation/2.1.0/JavaOpenID)をチェックすると、自分で例外をキャッチして処理することになっているようです。
いずれにせよ、例外をキャッチし、例外がスローされた場合は、ユーザーを関連情報を含むログイン ページにリダイレクトする必要があります。
このようなものが動作するはずです:
public class Application extends Controller {
public static Result index() {
return ok("welcome");
}
public static Result auth() {
Map<String, String> attributes = new HashMap<String, String>();
attributes.put("email", "http://schema.openid.net/contact/email");
final Promise<String> stringPromise = OpenID.redirectURL("https://www.google.com/accounts/o8/id", "http://localhost:9000/auth/callback",attributes);
return redirect(stringPromise.get());
}
public static Result callback() {
try{
Promise<UserInfo> userInfoPromise = OpenID.verifiedId();
final UserInfo userInfo = userInfoPromise.get();
System.out.println("id:"+userInfo.id);
System.out.println("email:"+userInfo.attributes.get("email"));
return ok(userInfo.attributes.toString());
} catch (Throwable e) {
System.out.println(e.getMessage());
e.printStackTrace();
return unauthorized();
}
}
}