Playframework 如何在Play Framework中提交对象列表

Playframework 如何在Play Framework中提交对象列表,playframework,Playframework,这里是我的测试设置: 模型: 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 getFullNam

这里是我的测试设置:

模型:

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}
控制器:

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}
看起来play将选择映射到
null
对象列表。即使我将视图更改为:

<option value=${item} >${item.fullName}</option>
我至少得到了一个正确ID的列表

如何更改此项,以便play为我的项目创建正确的映射。我更喜欢获取
列表
,而不是
列表
(这里我必须执行查询以获取项目列表)

比尔,雷内

更新:

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}
如果我跑步:

curl -d "items[0].id=3&items[0].propertyA=bla&items[0].propertyB=blo&items[1].id=4" http://localhost:9000/application/save
Wich使用上述参数发布帖子,我得到:

A02:39:53,072 INFO  ~ item: bla - blo
02:39:53,072 INFO  ~ item: null - null
02:39:53,072 INFO  ~ -------
这样它可以工作,但我不知道如何更改视图,以便它发布上述参数:-(

更新2:

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}
在Felipe的帮助下,我让它开始工作。必须添加此控制器方法:

@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(仅={“保存”})
静态void parseParams(){
String[]items=params.getAll(“items”);
参数。移除(“项目”);
对于(int i=0;i
这是一个绑定问题,play没有绑定它接收的long[]参数

从play的文档开始: 您需要将select上的名称更改为
items.id

它可能无法工作,因为play希望列表的索引为
items[i].id

无论如何,如果这不能解决你的问题,你可以做一个自定义绑定,但是当你在很多地方需要这个绑定的时候,这个选项是很好的,如果你只做了一次,没有理由不按照你在文章最后说的做查询。(Play将进行此查询以执行此绑定,因此您不会因为自己执行此操作而失去或赢得任何性能)

更新 大致如下:

@Before(only={"save"})
static void parseParams() {  
    String[] itens = params.getAll("items")
    for (int i=0;i<itens.length;i++) {
        params.put("items["+i+"].id",itens[i])
    }
}
@Before(仅={“保存”})
静态void parseParams(){
字符串[]itens=params.getAll(“项”)

对于(int i=0;我有一种方法可以使用@Before interceptor来完成…我将更新我的答案..感谢它现在可以工作了,我将工作版本添加到了更新2中。