我已经为模型“ 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();


包装的weightElk属性将为零。因此,您的表格将被视为无效,因为weight是必填值。


  要澄清的是,您得到的IllegalStateException不是因为
  您的视图或模型代码中存在错误。那是因为你在努力
  解开包含验证错误的表单对象。作为
  文档和样本说明,您仅应致电
  调用get()之后,窗体上的.hasErrors()方法
  已返回false


纠正此错字后,我可能会看看您的非原始字段(sumTicksumLicesexareahuntingField)发送了什么。我将继续假设模型类中的关联类型为枚举。如果是这种情况,则应检查所提交的值是否是对应的枚举值的名称(在这种情况下,绑定将产生有效的形式)。

更新资料

您的date字段跳过了我的注意。如果您以yyyy-MM-dd格式提交日期,请在模型类的date属性中添加以下注释。

@Required
@Formats.DateTime(pattern="yyyy-MM-dd")
private Date date;


这是sample projects中采用的方法。有了这个注释,Play将使用POST提交中的日期字符串填充表单对象中的Date字段。

09-05 01:10