これは非常に基本的なことのように思えるかもしれませんが、私は JPA/Ebean と Play Framework を初めて使用します (Java に関してはそれほど新しいものではありません)。
2つのフォームを作成しようとしています。1 つはログイン用、もう 1 つは登録用です。Play for Java MEAP (Early Access) という書籍、公式 Web サイトのドキュメント、およびサンプル アプリ「ZenTask」コードの両方を使用しています。Play は強力で堅牢であると言わざるを得ませんが、ドキュメントは貧弱です。これは、ほとんどの Play ユーザーが経験豊富な Java Web 開発者であることと関係があるに違いありませんが、それでも!
Userというモデルを作成しました
@Entity
@Table(name="account")
public class User extends Model {
@Id
@Constraints.Required
@Formats.NonEmpty
public String email;
@Constraints.Required
public String displayName;
@Constraints.Required
public String password;
public static Model.Finder<String, User> find = new Model.Finder(String.class, User.class);
public static User authenticate(String email, String password) {
return find.where()
.eq("email", email)
.eq("password", password)
.findUnique();
}
}
次に、このコントローラーアプリケーションがあります
public class Application extends Controller {
public static class Login {
@Constraints.Required
public String email;
public String password;
public String validate() {
if (User.authenticate(email,password)==null) {
return "Invalid email or password.";
}
return null;
}
}
public static class Register {
@Constraints.Required
public String email;
public String password;
public String cfmPassword;
public String displayName;
public String validate() {
if (cfmPassword.equals(password)) {
return "Passwords typed in does not match.";
} else if (displayName.contains(" ")) {
return "Display name cannot contain space";
}
return null;
}
}
}
なぜ 2 つの入れ子になったクラスを作成するのか理解できませんが、Play でフォームを作成する必要があるように見えますか? なので2つ作りました。これは、ページをレンダリングするために使用するコードです (コントローラー アプリケーション内にあります)。
public static Result index() {
return ok(index.render(form(Login.class), form(Register.class)));
}
さて、ここからが最もイライラする部分です。まず、ログイン時にユーザーを本当に認証したかどうかわかりません:(アプリケーションのコード)
/**
* Handle login form submission.
*/
public static Result authenticate() {
Form<Login> loginForm = form(Login.class).bindFromRequest();
if (loginForm.hasErrors()) {
return badRequest(index.render(loginForm, form(Register.class)));
} else {
session("email", loginForm.get().email);
return redirect(controllers.routes.Wall.index());
}
}
第二に、ユーザーが登録するときにユーザーの情報をどのように言うことができますか。これらの行を Java for Play ブックからコピーしましたが、機能しません (私の IDE は、それが間違っていると言っています..タイプの不一致です)
public static Result register() {
Form<Register> RegisterForm = form(Register.class).bindFromRequest();
if (RegisterForm.hasErrors()) {
return badRequest(index.render(form(Login.class), RegisterForm));
} else {
User user = RegisterForm.get();
session("email", RegisterForm.get().email);
return redirect(controllers.routes.Wall.initiate());
}
}
私はここで何か本当に間違ったことをしたに違いありません..誰かが私を少し啓発できますか?