1

これは非常に基本的なことのように思えるかもしれませんが、私は 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());
    }
}

私はここで何か本当に間違ったことをしたに違いありません..誰かが私を少し啓発できますか?

4

1 に答える 1

0

すみません。私は自分の問題を解決しました。型の不一致の問題をどのように処理したかを次に示します。「Login」や「Register」などのネストされた新しいクラスを作成するのではなく、モデルから直接 User クラスを使用する必要があったことがわかりました。

これらの行を Application コントローラーの下の register() メソッドに追加します。

User user = new User();
user.email = RegisterForm.get().email;
user.displayName = RegisterForm.get().displayName;
user.password = RegisterForm.get().password;
user.save();

私の質問は次のとおりです。 User クラスに validate() メソッドがない場合、エラーをチェックするために Play フレームワークは何を呼び出しますか? ネストされたクラスを使用する方が良いですか、それともモデルのクラスを直接使用する必要がありますか?"

于 2013-09-08T16:51:59.490 に答える