ここに私のテストのセットアップ:どのようにプレイ中のオブジェクトのリストを提出するためのフレームワーク
モデル:
package models;
import javax.persistence.Entity;
import play.db.jpa.Model;
@Entity
public class Item extends Model {
public String propertyA;
public String propertyB;
public String getFullName() {
return this.propertyA + " - " + this.propertyB;
}
}
コントローラー:
package controllers;
import play.*;
import play.mvc.*;
import java.util.*;
import models.*;
public class Application extends Controller {
public static void index() {
List<Item> allItems = Item.findAll();
render(allItems);
}
public static void save(List<Item> items) {
if (items == null) {
Logger.info("no items");
} else {
for (Item item : items) {
Logger.info("item: %s",item);
}
Logger.info("-------");
}
index();
}
}
ビュー:
#{extends 'main.html' /}
#{set title:'Home' /}
#{form @Application.save()}
Select Items:
<div>
<select name="items" style="width: 200px;" multiple="multiple" size="10">
#{list items:allItems, as: 'item'}
<option value=${item.id} >${item.fullName}</option>
#{/list}
</select>
</div>
<input type="submit" value="Save" />
#{/form}
私は[選択]ボックスで2つの項目を選択すると、私は次のログ出力を得る:
06:22:20,560 INFO ~ -------
06:22:26,991 INFO ~ item: null
06:22:26,991 INFO ~ item: null
プレイがnull
オブジェクトのリストに選択をマップするように見えます。私はビューを変更する場合でも:
<option value=${item} >${item.fullName}</option>
私はnull
値を取得します。
しかし、私はにコントローラを変更します。私は、少なくとも正しいIDのリストを取得
public static void save(List<Long> items) {
...
}
。
どのようにしてこのアイテムを変更すれば、プレイによってアイテムに正しいマッピングが作成されるようにすることができますか?私はList<Long>
の代わりにList<Item>
を取得することを好む(ここで私は項目のリストをgehtするためにクエリを実行しなければならない)。
BR、ルネ
更新:
私が実行している場合:
curl -d "items[0].id=3&items[0].propertyA=bla&items[0].propertyB=blo&items[1].id=4" http://localhost:9000/application/save
WICHは、上記のパラメータとPOSTを行い、私が手:
A02:39:53,072 INFO ~ item: bla - blo
02:39:53,072 INFO ~ item: null - null
02:39:53,072 INFO ~ -------
のようにこれは動作しますが、私はどのようにビューを変更することができないのか分かりません。私はそれが動作するようになったフェリペからの助けを借りて
:それは
アップデート2 :-(上記のパラメータをポストO。このコントローラーメソッドを追加する必要があります。
@Before(only = {"save"})
static void parseParams() {
String[] items = params.getAll("items");
params.remove("items");
for (int i = 0; i < items.length; i++) {
Item item = Item.findById(Long.parseLong(items[i]));
params.put("items[" + i + "].id", items[i]);
params.put("items[" + i + "].propertyA", item.propertyA);
params.put("items[" + i + "].propertyB", item.propertyB);
}
}
@Beforeインターセプタでそれを行う方法があります...私は私の答えを更新します.. – Felipe