Play中的bindFromRequest问题!框架2.3

Dan*_*faq 9 java eclipse databinder playframework-2.3 eclipse-luna

我正在尝试使用Play的自动绑定功能,但没有成功.我正在用Java 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>
Run Code Online (Sandbox Code Playgroud)

这是我的班级"用户":

@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;

}
Run Code Online (Sandbox Code Playgroud)

这是我的控制器:

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());
  }
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么值的自动绑定不起作用.我已经确保我的表单中的字段名称对应于类中的属性名称,这应该足以使表单绑定起作用,对吧?

我正在使用Eclipse Luna,我关闭了自动项目构建(我从控制台手动完成).我知道有时Eclipse会因为自动构建功能而导致问题.注意:这是要走的路,但是我没有像使用Dmitri建议的那样使用activator命令清理项目.此外,只需在Eclipse中不启用自动构建功能,您只需执行一次此操作.

我已经尝试过多次重启Eclipse和应用程序,但没有成功......

编辑: 我尝试只为我的Users类使用String属性,因为requestData.get(String s)方法返回一个String.但仍然没有成功......

编辑2: 我要手动绑定值...如果有人有想法,请发布:)

编辑3: 我已经更新了我的代码,以遵循下面答案中提到的规则

编辑4: 我只能在使用Postgresql 9.3数据库时才能进行自动绑定.当我使用内存数据库时,一切都很顺利.此外,由于没有用于Java 8和postgresql 9.3的JDBC驱动程序,我使用的是较旧版本的驱动程序(实际上驱动程序在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;
        }
    });
Run Code Online (Sandbox Code Playgroud)

......但它不起作用!

编辑6: 用户Dmitri找到了一个可行的解决方案:您必须在Eclipse之外编译项目.似乎Eclipse的编译器和Play之间存在一些不兼容性!框架的编译器......

Dmi*_*sov 12

我一直在努力解决完全相同的问题:bindFromRequest为"name"字段返回了空值.我做了与Play for Java介绍视频中的一个人完全相同的事:youtube.com/watch?v = bLrmnjPQsZc.但仍然没有运气.我一直在使用JDK 1.8开发Windows 7.IDE:Eclipse 4.4.0.我通过cygwin运行激活器.

这就是我解决问题的方法:

  1. 在Eclipse中:项目 - >自动构建 - >关闭
  2. 在cygwin中:./ activator clean; ./activator编译; ./activator运行;

在此之后,bindFromRequest正确绑定名称并将其放入数据库.


abb*_*bas 5

为您的数据模型创建getter/setter.它解决了我的问题.