我为我的模型'Elk'创建了一个编辑视图,但是当我点击提交时,我只能获得'null'。
在'editElk'中,我使用数据库中的数据预填充表单。此数据在视图中正确呈现。单击“提交”时会发生错误。我评论过这条线给了我'没有价值'。我已经按照计算机数据库-jpa样本,但我不明白为什么我的表单返回“没有价值”。
这是我的控制者:
import play.data.*;
import static play.data.Form.*;
@Transactional(readOnly = true)
public static Result editElk(Long id) {
Form<Elk> editElkForm = form(Elk.class).fill(Elk.findById(id));
return ok(views.html.tableio.editelk.render("Edit Elg", editElkForm));
}
@Transactional
public static Result submitEditedElk() {
Form<Elk> submittedForm = form(Elk.class).bindFromRequest();
submittedForm.get().toTableData(); // Gives: IllegalStateException: No value]
if (submittedForm.hasErrors()) {
return ok(views.html.tableio.editelk.render("Edit Elg - Error",
submittedForm));
} else {
submittedForm.get().update(submittedForm.get().getId());
return TODO;
}
}
这是我的editElk视图:
@(title: String, elkForm: Form[Elk])
@import helper._
@main(title){
<h5>Edit</h5>
@form(action = routes.TableIO.submitEditedElk()) {
@inputText(elkForm("area"))
@inputText(elkForm("sex"))
@inputDate(elkForm("date"))
@inputText(elkForm("weigth"))
@inputText(elkForm("veal"))
@inputText(elkForm("antlers"))
@inputText(elkForm("age"))
@inputText(elkForm("twin"))
@inputText(elkForm("sumTick"))
@inputText(elkForm("sumLice"))
<button type="submit">Save</button>
}
}
最后我的路线档案:
GET /editelk/:elkid controllers.TableIO.editElk()
POST /submitEditedElk controllers.TableIO.submitEditedElk()
修改 根据要求,添加了Elk课程。
@Entity
public class Elk {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Required
private Date date;
@Required
private int weight;
@Required
private double age;
@Required
private int antlers;
@Required
private int veal;
@Required
private int twin;
@Required
@ManyToOne
private Tick sumTick;
@Required
@ManyToOne
private DeerLice sumLice;
@Required
@ManyToOne
private Sex sex;
@Required
@ManyToOne
private Area area;
@Required
@ManyToOne
private HuntingField huntingfield;
public static Elk findById(Long id) {
return JPA.em().find(Elk.class, id);
}
@Transactional
public void save() {
this.sumTick = Tick.findById(sumTick.id);
this.sumLice = DeerLice.findById(sumLice.id);
this.sex = Sex.findById(sex.id);
JPA.em().persist(this);
}
}
我省略了getter和setter。
答案 0 :(得分:3)
您的第一个问题可能是您在weight
输入字段中输入的拼写错误:
@inputText(elkForm("weigth")) // Should be @inputText(elkForm("weight"))
有了这个拼写错误,当您提交表单时,您的HTTP POST请求正文中将不会有weight
个密钥。因此,在以下语句中将POST数据绑定到表单对象时:
Form<Elk> submittedForm = form(Elk.class).bindFromRequest();
包装的weight
的{{1}}属性将为零。因此,您的表单将被视为无效,因为Elk
是必需值。
澄清一下,你得到的
weight
不是因为 您的视图或模型代码中存在错误。这是因为你正在努力 打开包含验证错误的表单对象。作为 文档和示例说明,你应该只调用 在您调用IllegalStateException
之后,表单上的get()
方法 已返回.hasErrors()
。
在纠正这个错字之后,我可能会看看你的非原始字段(false
,sumTick
,sumLice
,sex
发送了什么, area
)。我将继续并假设模型类中的关联类型是枚举。如果是这种情况,您应该检查提交的值是否是相应枚举值的名称(在这种情况下,绑定将生成有效的表单)。
您的huntingField
字段引起了我的注意。如果您以date
格式提交日期,请将以下注释添加到模型类的yyyy-MM-dd
属性中。
date
这是sample projects中采用的方法。使用此注释,Play将使用POST提交中的日期字符串填充表单对象中的Date字段。