2011-10-04 4 views
5

フォーム上のSetに正しくバインドする方法はありますか?私はPOJOを結合し、私のコントローラは、ユーザオブジェクトに Play framework FORMバインドリストの代わりに

public class Group implements Serializable { 

     public Long id; 

     public String name; 

    } 

私が見えることはできませんが

public static void create(User user) 

user.java

public class User implements Serializable { 



    public Long id; 

    @Required 
    @Email 
    public String email; 

    public Set<Group> groups; 

} 

Group.java

かかりやってる

私のフィールドをグループに結びつけるために

私はuser.groups []。id、user.groups [0] .id、user.groups.idを試しました。私はリストを使ってうまく動作するようにすることができますが、投稿時にN個の要素のリストを取得します(チェックされていない各チェックボックスに対して1つのnullがあります)。しかしそれは間違っているようです。編集

ユーザーとグループが永続エンティティであることを意味していない、プレイは単にUserGroup以来、

答えて

3

Play 1.2.4の新しいバインダー実装ではこれが可能です。

以前のプレイバージョンで

(2011年12月2日リリース)1.2.4に、あなたはリストへの結合に伴う問題は、あなたがリストを取得することである

user.groups[1].id = 1 
user.groups[1].name = "name1" 
user.groups[3].id = 3 
user.groups[3].name = "name3" 
user.groups[4].id = 4 
user.groups[4].name = "name4" 

のようなパラメータを送信することにより、セットをバインドできませんでした長さ5の場合、0と2の値はnullです。

あなたはまだこの問題を回避するには、代わりに設定したり、リストの

Map<String, Group> groups 

を使用することができ、1.2.4よりマイナープレイバージョンを使用する必要がある場合。その間にnull要素を取得せず、groups.values()を呼び出してCollectionを取得します。

+0

これを確認できたら、私は同意します:) – dstarh

+0

大括弧で囲まれた値はリストインデックスであり、ゼロから連続していなければなりません。 – tazmaniax

0

まず安らかなAPIのためのステートレスと永続的なレスプレゼンテーション層として機能していることは、エンティティのようですplay.db.jpa.Modelクラスを拡張し、@Entityとして定義する必要があります。たとえば:

@Entity 
public class User extends Model { 

    ... 

} 

Modelの延長のおかげで、あなたは、技術的なIDを(つまり、あなたがpublic Long idを削除することができます)を定義する必要はありません、あなたはこのクラスの一般的なDAOを持つことになります(Javadocを参照してください)

さて、あなたはそのようUserのグループを定義する必要があります。

@ManyToMany 
public Set<Group> groups; 
+0

OKユーザーとグループはエンティティではありませんが、再生は安心なAPIのためのステートレスで永続的ではないプレゼンテーションレイヤーとして機能しています。実際の問題は、おそらく私は十分な理由は、FORMがSETにバインドすることはできませんが、それはリストにすることができます強調していない – dstarh

0

私がプレイして似問題があります。 Playのバインディングは自動マジックですが、回避策が必要な場合もあります。

あなたは、単にセッター

public void setGroups(List<Group> groups) 

を作成し、内部であなたのセットに提供するグループを設定することができます。少し汚れていますが、うまくいくでしょう。

バインディングをシミュレートするためにユニットテストケースを作成することをお勧めします。 POSTリクエストをシミュレートするためのマップを作成し、オブジェクトへのマップをバインダーにバインドします。 Webインターフェイスからプロセスを繰り返すよりもはるかに簡単です。回帰テストを作成し、Playのアップデートがバインディングビヘイビアの一部を破っていることを警告します(それは私に起こります)。

+0

はいこれは動作するが、それでもあなたのフィールドobj .collection [index] .prop – dstarh