gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:47:56 25 4
gpt4 key购买 nike

这是我的测试设置:

型号:

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

Controller :
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}

当我在选择框中选择两个项目时,我得到以下日志输出:
06:22:20,560 INFO  ~ -------
06:22:26,991 INFO ~ item: null
06:22:26,991 INFO ~ item: null

看起来 play 将选择映射到列表 null对象。即使我将 View 更改为:
<option value=${item} >${item.fullName}</option>

我得到 null值(value)观。

但是当我将 Controller 更改为:
public static void save(List<Long> items) {
...
}

我至少得到了一个正确 ID 的列表。

我该如何更改它,以便 play 为我的项目创建正确的映射。我更喜欢得到 List<Item>而不是 List<Long> (在这里我必须执行查询以获取项目列表)。

BR,雷内

更新:

如果我运行:
curl -d "items[0].id=3&items[0].propertyA=bla&items[0].propertyB=blo&items[1].id=4" http://localhost:9000/application/save

使用上述参数进行 POST 后,我得到:
A02:39:53,072 INFO  ~ item: bla - blo
02:39:53,072 INFO ~ item: null - null
02:39:53,072 INFO ~ -------

像这样它可以工作,但我看不到如何更改 View ,以便它发布上述参数:-(

更新 2:

在 Felipe 的帮助下,我开始工作了。必须添加此 Controller 方法:
@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);
}
}

最佳答案

这是一个绑定(bind)问题,play 没有绑定(bind)它接收到的 long[] 参数。

来自 play 的文档:http://www.playframework.org/documentation/1.2.3/controllers#objectbinding
您需要将您选择的名称更改为 items.id
它可能不起作用,因为 play 期望列表的索引为 items[i].id ...

无论如何,如果这不能解决您的问题,您可以进行自定义绑定(bind),但是当您在很多地方需要此绑定(bind)时,该选项主要是好的,如果您只做一次,没有理由不要像您在帖子末尾所说的那样进行查询。 (Play 会做这个查询来做这个绑定(bind),所以你自己做不会失去或赢得任何性能)

更新
类似的东西:

@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])
}
}

应该管用。

另一种方法是 javascript,但它更难,更容易出错。

关于playframework - 如何在 Play Framework 中提交对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7417321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com