Я пытаюсь использовать функцию автоматической привязки Play, но безуспешно. Я разрабатываю на Java, на Eclipse 4.4 Luna.
Вот моя форма:
<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 может вызывать проблемы из-за этой функции автоматической сборки. Примечание. Так и было, но я не чистил проект с помощью команды активатора, как предложил пользователь Дмитрий. Кроме того, вам нужно сделать это только один раз, если вы не включили функцию автоматической сборки в Eclipse.
Я пытался перезапустить Eclipse и приложение несколько раз, но безуспешно...
EDIT: я пытался использовать только атрибуты String для своего класса Users, так как метод requestData.get(String s) возвращает String. Но пока безуспешно...
РЕДАКТИРОВАТЬ 2: я собираюсь связать значения вручную... Если у кого-то есть идея, напишите :)
EDIT 3: я обновил свой код, чтобы следовать правилам, упомянутым в ответе ниже.
EDIT 4: я не могу заставить автопривязку работать только при использовании моей базы данных Postgresql 9.3. Когда я использую базу данных в памяти, все работает гладко. Кроме того, поскольку не было драйвера JDBC для Java 8 и postgresql 9.3, я использую более старую версию драйвера (на самом деле драйвер находится на веб-сайте PGSQL, но я не смог заставить его работать с Play). Мне нужно будет проверить, что происходит с другой БД, и я отчитаюсь здесь!
РЕДАКТИРОВАТЬ 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;
}
});
... но это не сработало!
EDIT 6: Пользователь Дмитрий нашел рабочее решение: вам нужно скомпилировать проект вне Eclipse. Похоже, что есть некоторая несовместимость между компилятором Eclipse и Play! Компилятор фреймворка...