gpt4 book ai didi

java - Play 中的 bindFromRequest 问题!框架 2.3

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:07:13 25 4
gpt4 key购买 nike

我正在尝试使用 Play 的自动绑定(bind)功能,但没有成功。我在 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;

}

这是我的 Controller :

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());
}
}

我想知道为什么值的自动绑定(bind)不起作用。我已确保我的表单中的字段名称对应于类中的属性名称,这应该足以让表单绑定(bind)正常工作,对吧?

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

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

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

编辑 2:我将手动绑定(bind)这些值...如果有人有想法,请发帖 :)

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

编辑 4:仅当使用我的 Postgresql 9.3 数据库时,我无法使自动绑定(bind)工作。当我使用内存数据库时,一切都很顺利。此外,由于没有适用于 Java 8 和 postgresql 9.3 的 JDBC 驱动程序,我使用的是旧版本的驱动程序(实际上该驱动程序在 PGSQL 的网站上,但我无法让它与 Play 一起使用)。我将不得不检查另一个数据库发生了什么,然后我会在这里报告!

编辑 5:我试图像这样创建我的自定义数据 Binder :

        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 之间有些不兼容!框架的编译器...

最佳答案

我一直在努力解决完全相同的问题:bindFromRequest 为“名称”字段返回空值。我做的和这个 Play for Java 介绍视频中的一个人做的完全一样:youtube.com/watch?v=bLrmnjPQsZc。但仍然没有运气。我一直在使用 JDK 1.8 开发 Windows 7。集成开发环境:Eclipse 4.4.0。我通过 cygwin 运行激活器。

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

  1. 在 Eclipse 中:项目 -> 自动构建 -> 关闭
  2. 在 cygwin 中:./活化剂清洁;./激活器编译;./激活器运行;

在此之后,bindFromRequest 正确绑定(bind) name 并将其放入数据库。

关于java - Play 中的 bindFromRequest 问题!框架 2.3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25365707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com