我已经为模型“ Elk”创建了一个编辑视图,但是当我单击“提交”时,我只会得到“空”。
在“ editElk”中,我用数据库中的数据预填充表单。此数据在视图中正确呈现。单击“提交”时发生错误。我评论了这一行,给了我“没有价值”。我遵循了computer-database-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。
最佳答案
您的第一个问题可能是您在weight
输入字段中遇到的错字:
@inputText(elkForm("weigth")) // Should be @inputText(elkForm("weight"))
使用此错字,当您提交表单时,HTTP POST请求的正文中将没有
weight
键。因此,在以下语句中将POST数据绑定到表单对象时:Form<Elk> submittedForm = form(Elk.class).bindFromRequest();
包装的
weight
的Elk
属性将为零。因此,您的表格将被视为无效,因为weight
是必填值。要澄清的是,您得到的
IllegalStateException
不是因为您的视图或模型代码中存在错误。那是因为你在努力
解开包含验证错误的表单对象。作为
文档和样本说明,您仅应致电
调用
get()
之后,窗体上的.hasErrors()
方法已返回
false
。纠正此错字后,我可能会看看您的非原始字段(
sumTick
,sumLice
,sex
,area
,huntingField
)发送了什么。我将继续假设模型类中的关联类型为枚举。如果是这种情况,则应检查所提交的值是否是对应的枚举值的名称(在这种情况下,绑定将产生有效的形式)。更新资料
您的
date
字段跳过了我的注意。如果您以yyyy-MM-dd
格式提交日期,请在模型类的date
属性中添加以下注释。@Required
@Formats.DateTime(pattern="yyyy-MM-dd")
private Date date;
这是sample projects中采用的方法。有了这个注释,Play将使用POST提交中的日期字符串填充表单对象中的Date字段。