Play Framework — Как устранить неполадки, связанные с нулевыми значениями, с помощью методов bindFromRequest() и get()

#java #playframework #playframework-2.6

#java #playframework #playframework-2.6

Вопрос:

Я программирую небольшой веб-сайт на Java Play Framework 2.6.21 с sbt версии 1.2.8, Scala версии 2.11.12. Я пытаюсь создать некоторые формы с помощью класса Form<>, но у меня возникают некоторые проблемы с методами bindFromRequest () и get (), которые всегда возвращают NULL. Как я могу это исправить?

Я попробовал несколько ответов об этой проблеме (включая переполнение стека), но ничего не сработало.

Я попытался изменить версию SBT, тот же результат.

Я пытался включить Ebean, но это хуже, у меня больше ошибок при внедрении…

Вот мой класс

 package models;

import play.data.validation.Constraints;
import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

@Entity
@Table(name = "usernames")
public class User {
    @Id
    @GeneratedValue
    public Integer Id;

    public String name;

    public User(){}

    public User(Integer Id, String name) {
        this.Id = Id;
        this.name = name;
    }

    private static Set<User> users;

    static {
        users = new HashSet<>();

        users.add(new User(1, "John"));
        users.add(new User(2, "Jack"));

    }

    public static Set<User> getAllUsers() {
        return users;
    }

    public static User userById(Integer Id) {
        for (User user : users) {
            if (Id.equals(user.Id)) {
                return user;
            }
        }

        return null;
    }

    public static void addUser(User user) {
        users.add(user);
    }

    public static String validate() {
        return "Good";
    }

    public void setId() {
        this.Id = Id;
    }

    public void setName() {
        this.name = name;
    }

    public Integer getId() {
        return this.Id;
    }

    public String getName() {
        return this.name;
    }
}
  

Вот мои файлы маршрутов для моего веб-сайта

 #The user webpage
GET /user controllers.UserController.index()
GET /user/newUser   controllers.UserController.create()
GET /user/resultCreate controllers.UserController.resultCreate()
GET /user/:id   controllers.UserController.show(id : Integer)
  

Вот мой HTML-файл

 @(userForm : Form[models.User])
@import helper._
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Create a new user</title>
        <link rel="stylesheet" href='@routes.Assets.at("stylesheets/helloworld.css")'>
        <link rel="icon" href='@routes.Assets.at("images/favicon.png")'>
    </head>
    <body>
    @helper.form(routes.UserController.resultCreate()) {
        @helper.CSRF.formField
        @helper.inputText(userForm("Id"))
        @helper.inputText(userForm("name"))
        <button type="submit">Create widget</button>
    }
    </body>
</html>
  

И, наконец, вот часть кода для результата

 public Result resultCreate() {
        Form<User> userForm = formFactory.form(User.class).bindFromRequest(request());
        System.out.println(userForm);
        User user;
        if(!userForm.hasErrors()) {
            Logger.debug("Id : "   userForm.get().Id);
            user = userForm.get();
            Logger.debug(User.validate());
        } else {
            System.out.println("Not good");
            user = null;
        }
        return ok(views.html.resultCreate.render(user));
    }
  

Я за исключением того, что введенный пользователь отображается на веб-странице результатов, но ничего не отображается. Я тестировал отображение в консоли, и значение атрибутов класса равно NULL.

Вот что отображается на моей консоли :

 Form(of=class models.User, data={name=Toto, csrfToken=109d71e13e39d0c23e8874b4c71f9e6387890cdc-1553372828827-d4c200687a8689d336c0c962, Id=7}, value=Optional[models.User@6b8e
fb4f], errors=[ValidationError(,[Good],[])])
  

У меня нет никаких предложений.

Ответ №1:

Ваша форма содержит непустые ошибки errors=[ValidationError(,[Good],[])]) , поэтому вы не можете получить свой объект путем вызова userForm.get() .

Я бы удалил это:

 public static String validate() {
        return "Good";
}