我试图使用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可能会因为自动构建功能而导致问题.注意:这是要去的方式,但是我没有使用激活程序命令清理项目,就像Dmitri用户建议的那样.此外,只需要在Eclipse中启动自动构建功能即可,只需执行一次.
我已经尝试重新启动Eclipse和应用程序几次,没有成功…
编辑:
因为requestData.get(String s)方法返回一个String,所以我尝试仅使用我的Users类的String属性.但仍然没有成功…
编辑2:
我要手动绑定值…如果有人有想法,请发表:)
编辑3:
我已经更新了我的代码,以遵循下面的答案中提到的规则
编辑4:
只有使用Postgresql 9.3数据库时,我无法自动绑定.当我使用内存数据库时,一切顺利.另外,由于没有用于Java 8和postgresql 9.3的JDBC驱动程序,所以我使用的是旧版本的驱动程序(实际上驱动程序位于PGsql的网站上,但是我无法使用它).我必须检查另一个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之间有一些不兼容框架的编译器