Play framework(2.8.*)Java中将输入从scala.html作为表单传递到Controller时出现NullPointerException

gk7wooem  于 2023-05-27  发布在  Java
关注(0)|答案(2)|浏览(131)

我正在使用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

8ehkhllq

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的原因并解决问题。
希望能帮上忙。

ocebsuys

ocebsuys2#

这里有一个我注意到的关键错误,这可能是导致问题的原因。您正在创建嵌套窗体。那条线

@helper.form(action = routes.Users.save()

创建一个表单标记,并且您再次在它的正下方添加了一个表单标记。尝试删除内部(显式)<form>标记并匹配</form>。应该能用

相关问题