Play框架:从请求绑定返回'null'

时间:2014-02-18 16:00:05

标签: java jpa playframework playframework-2.2

我为我的模型'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。

1 个答案:

答案 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()

在纠正这个错字之后,我可能会看看你的非原始字段(falsesumTicksumLicesex发送了什么, area)。我将继续并假设模型类中的关联类型是枚举。如果是这种情况,您应该检查提交的值是否是相应枚举值的名称(在这种情况下,绑定将生成有效的表单)。

更新

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

date

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