我正在尝试使用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>
以下是我的 "Users" 类:
@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可能会因为自动构建功能而出现问题。注意:这是正确的方法,但我没有使用activator命令清理项目,就像用户Dmitri建议的那样。此外,只要您不在Eclipse中打开自动构建功能,您只需要执行一次即可。 我已经尝试了多次重新启动Eclipse和应用程序,但都没有成功...
编辑: 我尝试仅使用Users类的String属性,因为requestData.get(String s)方法返回一个字符串。但仍然没有成功...
编辑2: 我将手动绑定值...如果有人有想法,请发帖 :)
编辑3: 我已更新我的代码,遵循下面答案中提到的规则。
编辑4: 只有在使用我的Postgresql 9.3数据库时,我才无法让自动绑定正常工作。当我使用内存数据库时,一切都顺利。此外,由于没有适用于Java 8和postgresql 9.3的JDBC驱动程序,我正在使用较旧版本的驱动程序(实际上驱动程序在PGSQL的网站上,但我无法在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!框架的编译器之间存在一些不兼容性...