gpt4 book ai didi

java - Play Framework : Bind from request returns 'null'

转载 作者:行者123 更新时间:2023-12-01 23:11:37 25 4
gpt4 key购买 nike

我已经为我的模型“Elk”创建了一个编辑 View ,但是当我单击“提交”时,我只得到“null”。

在“editElk”中,我使用数据库中的数据预填充表单。该数据在 View 中正确呈现。当我点击“提交”时发生错误。我评论了该行,给我“没有值(value)”。我已经遵循了 computer-database-jpa 示例,但我只是无法理解为什么我的表单返回“无值”。

这是我的 Controller :

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 View :

@(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。

最佳答案

您的第一个问题可能是您在体重输入字段中的拼写错误:

@inputText(elkForm("weigth")) // Should be @inputText(elkForm("weight"))

由于此拼写错误,当您提交表单时,HTTP POST 请求正文中不会有 weight 键。因此,当您在以下语句中将 POST 数据绑定(bind)到表单对象时:

Form<Elk> submittedForm = form(Elk.class).bindFromRequest();

包装的 Elkweight 属性将为零。因此,您的表单将被视为无效,因为重量是必需的值。

To clarify, the IllegalStateException you're getting isn't because there's a bug in your view or model code. It is because you're trying to unwrap a form object that contains validation errors. As the documentation and samples illustrate, you should only call the get() method on a form after you've called .hasErrors() and it has returned false.

更正此拼写错误后,我可能会看看为您的非原始字段发送的内容(sumTicksumLicesex区域狩猎场)。我将继续假设模型类中的关联类型是枚举。如果是这种情况,您应该检查提交的值是否是相应枚举值的名称(在这种情况下,绑定(bind)将生成有效的表单)。

更新

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

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

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

关于java - Play Framework : Bind from request returns 'null' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21858952/

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