我正在使用play framework(2.8.19)创建一个java web应用程序。在创建注册页面时,我试图将输入从注册页面(scala.html)传递到控制器类,控制器类将输入保存到Postgres表。在这里,我在访问控制器类的输入字段时遇到了空指针异常。下面是注册页面、控制器类和我的路由文件的代码。
Routes.file
`POST /users/ controllers.Users.save(request: Request)`
registraion.scala.html
@(userFrom: Form[commons.Forms.User])
@()(implicit request: Http.Request)
<!--@(userFrom: Form[commons.Forms.User]) (implicit request: RequestHeader, messagesProvider: play.i18n.MessagesProvider)-->
@main("User form") {
<h1>User form</h1>
@helper.form(action = routes.Users.save()) {
<form>
<!-- <legend>User (@userFrom("name").value)</legend>-->
<!-- <legend>User (userFrom("email"))</legend>-->
<div class="form-group">
<label for="name">Email address</label>
<input type="text" class="form-control" id="name" name="name" placeholder="Name">
</div>
<div class="form-group">
<label for="email">Email address</label>
<input type="email" class="form-control" id="email" name="email" placeholder="Email">
</div>
<div class="form-group">
<label for="password">Password</label>
<input type="password" class="form-control" id="password" name="password" placeholder="Password">
</div>
<input type="submit" class="btn btn-primary" value="Save">
<a class="btn" href="@routes.Authentication.login()">Cancel</a>
</form>
}
}
Users.java(Controller)
public class Users extends Controller {
private IUserDao iuserDao;
private final Form<Forms.User> formFactory;
private final play.i18n.MessagesApi messagesApi;
@Inject
public Users(FormFactory formFactory, MessagesApi messagesApi) {
this.formFactory = formFactory.form(Forms.User.class);
this.messagesApi = messagesApi;
}
public Result save(Http.Request request) {
Messages messages = this.messagesApi.preferred(request);
System.out.println("calling here");
System.out.println(request.getHeaders());
Form<Forms.User> userForm = formFactory.bindFromRequest(request);
if (userForm.hasErrors()) {
return badRequest(registration.render(userForm));
}
Forms.User user = userForm.get();
System.out.println(user.email); //** <====== Facing error in this line =====>**
models.AppUser searchResult = (AppUser) iuserDao.findByEmail(user.email);
if (searchResult != null) {
return badRequest(registration.render(userForm));
}
iuserDao.create(user);
return redirect(routes.Authentication.login());
}
}
这里Form User类为
public class Forms {
public static class User {
public String name;
public String email;
public String password;
}
}
错误的快照在这里。
ERROR
2条答案
按热度按时间8ehkhllq1#
错误消息指示在Users类的保存方法中调用System.out.println(www.example.com)的行中出现NullPointerExceptionuser.email。
问题似乎是userForm.get()方法返回null,这导致在尝试访问user对象的email属性时出现NullPointerException。
要调试此问题,可以检查以下内容:
1.确保注册视图(registration.scala.html)中的表单字段具有与Forms.User类中的属性相对应的正确的name属性。在您的示例中,表单字段应该具有name=“name”、name=“email”和name=“password”。
1.检查表单数据是否在请求中正确发送。您可以在保存方法中打印请求头,以验证表单数据是否存在。
System.out.println(request.getHeaders());
1.验证表单绑定(formFactory.bindFromRequest(request))是否成功,以及userForm对象是否正确填充。您可以打印表单数据以检查它是否包含预期值。
System.out.printlnuserForm.data();
如果表单数据未正确发送或表单绑定不成功,则可能导致userForm为空值。请确保表单域的名称正确,并且表单数据按预期发送。
此外,优雅地处理错误情况是一个很好的实践。不要直接访问www.example.com这样的属性user.email,可以考虑使用userForm.get(“email”)来检索表单值,并处理值为null或空的情况。
通过调查这些点,您应该能够确定NullPointerException的原因并解决问题。
希望能帮上忙。
ocebsuys2#
这里有一个我注意到的关键错误,这可能是导致问题的原因。您正在创建嵌套窗体。那条线
创建一个表单标记,并且您再次在它的正下方添加了一个表单标记。尝试删除内部(显式)
<form>
标记并匹配</form>
。应该能用