9

Play の自動バインド機能を使用しようとしていますが、うまくいきません。私は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;

}

そして、ここに私のコントローラーがあります:

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

値の自動バインディングが機能しないのはなぜでしょうか。フォームのフィールド名がクラスの属性名に対応していることを確認しました。フォーム バインディングが機能するにはこれで十分ですよね?

私は Eclipse Luna を使用しており、プロジェクトの自動ビルドをオフにしました (コンソールから手動で行います)。その自動ビルド機能が原因で、Eclipse が問題を引き起こす場合があることを私は知っています。注:これは行くべき道でしたが、ユーザーDmitriが提案したように、アクティベーターコマンドを使用してプロジェクトをクリーンアップしませんでした. また、Eclipse で自動ビルド機能をオンにしない限り、これを行う必要があるのは 1 回だけです。

Eclipse とアプリケーションを数回再起動しようとしましたが、成功しませんでした...

編集: requestData.get(String s) メソッドが文字列を返すため、Users クラスに文字列属性のみを使用してみました。しかし、まだ成功していません...

編集 2: 値を手動でバインドするつもりです...誰かアイデアがあれば、投稿してください:)

EDIT 3: 以下の回答に記載されているルールに従うようにコードを更新しました

編集 4: Postgresql 9.3 データベースを使用している場合にのみ、自動バインドが機能しません。インメモリ データベースを使用すると、すべてがスムーズに機能します。また、Java 8 と postgresql 9.3 用の JDBC ドライバーがなかったので、古いバージョンのドライバーを使用しています (実際にはドライバーは PGSQL の Web サイトにありますが、Play では動作しませんでした)。別のDBで何が起こるかを確認する必要があるので、ここで報告します!

編集 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;
        }
    });

...しかし、うまくいきませんでした!

編集 6: ユーザー Dmitri は有効な解決策を見つけました。Eclipse の外部でプロジェクトをコンパイルする必要があります。Eclipse のコンパイラと Play の間にはいくつかの非互換性があるようです! フレームワークのコンパイラ...

4

6 に答える 6

12

私はまったく同じ問題に苦しんでいます: bindFromRequest は「名前」フィールドに対して null を返しました。私は、この Play for Java の紹介ビデオ (youtube.com/watch?v=bLrmnjPQsZc) の人がしたこととまったく同じことをしました。しかし、まだ運がありません。私はJDK 1.8でWindows 7に取り組んできました。IDE: エクリプス 4.4.0。そして、cygwin を介してアクティベーターを実行します。

これが私にとって問題を解決したものです:

  1. Eclipse の場合: プロジェクト -> 自動的にビルド - > オフ
  2. Cygwin の場合: ./activator clean; ./アクティベーター コンパイル; ./アクティベーター実行;

この後、bindFromRequest は name を正しくバインドし、データベースに入れます。

于 2014-09-04T11:36:03.343 に答える
5

データ モデルのゲッター/セッターを作成します。それは私の問題を解決しました。

于 2015-09-19T03:13:58.317 に答える
1

セッターとゲッターを追加することでこれを解決しました。エンティティ/モデル クラスがある場合は、セッターとゲッターを追加する必要があります。FormData クラスがある場合は、それにセッターとゲッターも追加します。

だからあなたが電話するとき

Form<YourFormData> formData =       Form.form(YourFormData.class).bindFromRequest(); 
 YourFormData formData = formData.get(); 

formData にすべての値が設定されます。お役に立てれば!

于 2016-06-23T14:21:53.633 に答える
0

この投稿には受け入れられた回答があることは知っていますが、この問題に関する私の経験を投稿したかったのです。

私は同じ問題を抱えていて、上記の回答に記載されているすべての手順を実行しました。つまり、Eclipse は自動的にビルドし、アクティベーターを介してクリーンアップしてコンパイルしました。しかし、これはうまくいきませんでした。私はさまざまな方法を試し、Eclipse の依存関係を作成せずにゼロからプロジェクトを作成することさえしました。それでも、うまくいきませんでした。

次に、自分のモデルを見て、プロパティ名の大文字と小文字を変更してみることにしました。出来た!

私のモデルが以前のように見えたのは次のとおりです。

public class Test {
 public String FirstName;
 public String LastName;}

今、私はそれを次のように変更しました:

public class Test {
  public String firstName;
  public String lastName;}

明らかではなく、私は.Netから来ているので、これを指摘したかっただけです

于 2014-12-05T14:15:24.063 に答える