Play の自動バインド機能を使用しようとしていますが、うまくいきません。私はEclipse 4.4 LunaでJavaで開発しています。
ここに私のフォームがあります:
<h2>Create a new user</h2>
<form action="@routes.Backend.createUser()" method="post">
First Name
<input type="text" name="firstName" />
Last Name
<input type="text" name="lastName" />
E-mail
<input type="email" name="email" />
PIN
<input type="number" name="pin" />
Status
<input type="text" name="status" />
Is guest?
<input type="checkbox" name="isGuest" />
<input type="submit" value="Create user" />
</form>
ここに私のクラス「ユーザー」があります:
@Entity
public class Users extends Model {
// Database columns
@Id
public int userId;
public String firstName;
public String lastName;
public String email;
public int pin;
public String status;
public boolean isGuest;
}
そして、ここに私のコントローラーがあります:
public class Backend extends Controller {
public static Result createUser() {
Form<Users> form = Form.form(Users.class).bindFromRequest();
if (form.hasErrors()) {
// doSomething()
} else {
Users u = form.get();
u.save();
}
// TESTING
// Checking the content of the request
DynamicForm requestData = Form.form().bindFromRequest();
String firstName = requestData.get("firstName");
String lastName = requestData.get("lastName");
// Printing the content works, I am able to see the correct values
System.out.println(firstName); // Bob
System.out.println(lastName); // Smith
// This somehow doesn't work...
System.out.println(u.firstName); // NULL
System.out.println(u.lastName); // NULL
System.out.println(u.userId); // Correctly generated
// END OF TESTING
return redirect(routes.Backend.allUsers());
}
}
値の自動バインディングが機能しないのはなぜでしょうか。フォームのフィールド名がクラスの属性名に対応していることを確認しました。フォーム バインディングが機能するにはこれで十分ですよね?
私は Eclipse Luna を使用しており、プロジェクトの自動ビルドをオフにしました (コンソールから手動で行います)。その自動ビルド機能が原因で、Eclipse が問題を引き起こす場合があることを私は知っています。注:これは行くべき道でしたが、ユーザーDmitriが提案したように、アクティベーターコマンドを使用してプロジェクトをクリーンアップしませんでした. また、Eclipse で自動ビルド機能をオンにしない限り、これを行う必要があるのは 1 回だけです。
Eclipse とアプリケーションを数回再起動しようとしましたが、成功しませんでした...
編集: requestData.get(String s) メソッドが文字列を返すため、Users クラスに文字列属性のみを使用してみました。しかし、まだ成功していません...
編集 2: 値を手動でバインドするつもりです...誰かアイデアがあれば、投稿してください:)
EDIT 3: 以下の回答に記載されているルールに従うようにコードを更新しました
編集 4: Postgresql 9.3 データベースを使用している場合にのみ、自動バインドが機能しません。インメモリ データベースを使用すると、すべてがスムーズに機能します。また、Java 8 と postgresql 9.3 用の JDBC ドライバーがなかったので、古いバージョンのドライバーを使用しています (実際にはドライバーは PGSQL の Web サイトにありますが、Play では動作しませんでした)。別のDBで何が起こるかを確認する必要があるので、ここで報告します!
編集 5: 次のようなカスタム データ バインダーを作成しようとしました。
Formatters.register(User.class, new Formatters.SimpleFormatter<User>() {
@Override
public User parse(String arg0, Locale arg1) throws ParseException {
User u = new Model.Finder<Integer, User>(Integer.class, User.class).byId(Integer.parseInt(arg0));
return u;
}
@Override
public String print(User arg0, Locale arg1) {
return "User : " + arg0.firstName;
}
});
...しかし、うまくいきませんでした!
編集 6: ユーザー Dmitri は有効な解決策を見つけました。Eclipse の外部でプロジェクトをコンパイルする必要があります。Eclipse のコンパイラと Play の間にはいくつかの非互換性があるようです! フレームワークのコンパイラ...