我正在看Play! Java的框架,我遇到了一个非常好奇的错误:
我有一个带有以下必填字段的模型(除了id之外没有其他字段)
@Lob
@Constraints.Required
private String content;
@Constraints.Email
@Constraints.Required
private String email;
@Constraints.Required
private String title;
我的控制器中有以下方法:
public static Result createEntry() {
Form<BlogEntry> filledForm = blogEntryForm.bindFromRequest();
if (filledForm.hasErrors()) {
Logger.debug(filledForm.data().toString());
Logger.debug(filledForm.errors().toString());
return badRequest(newentry.render(filledForm));
}
BlogEntry entry = filledForm.get();
entry.save();
return redirect(routes.BlogController.index());
}
public static Result newEntry() {
return ok(newentry.render(blogEntryForm));
}
视图如下:
@(blogform: Form[BlogEntry])
@import helper._
@main("New Blog Entry") {
@form(routes.BlogController.createEntry()) {
@if(blogform.hasErrors) {
Errors in form
}
<fieldset>
<div>
@inputText(blogform("email"), '_label -> "Email")
</div>
<div>
@inputText(blogform("title"), '_label -> "Title")
</div>
<div>
@inputText(blogform("content"), '_label -> "Content")
</div>
<button type="submit">Submit</button>
</fieldset>
}
}
现在,当我在浏览器中导航到表单并输入一些数据时,单击“提交”,我会被重定向到表单,因此调用了代码的badRequest
部分。所以我开始记录表单和验证错误的输出,结果出来了:
[debug] application - {content = test,title = test,email=me@example.com}
[debug] application - {content = [ValidationError(content,error.required,[])],title = [ValidationError(title,error.required,[])],email = [ValidationError(email,error。需要,[])]}
数据肯定存在,当我在提交后重定向到表单时,字段仍然填充了正确的数据。我错过了一些明显的东西吗?
答案 0 :(得分:3)
现在想出来:原因是我的模型中的字段没有设置器。这样,表单无法设置属性并以静默方式失败。
答案 1 :(得分:0)
您好我知道自从您看过这一年以来已经过去了一年,但我现在有更多信息可供刚刚参加此活动的人使用。在使用2.4.x并设置ebeans时,我遇到了这个页面:Play Enhancer。播放增强器是字节代码魔术,它允许在项目中使用公共字段和直接访问,但在构建时实际封装了字段。
增强器查找Java类上的所有字段:
是公开的
是非静态的
不是最终的
对于每个字段,如果它们尚不存在,它将生成一个getter和一个setter。如果您希望为字段提供自定义getter或setter,只需编写它就可以完成,Play增强器只会跳过getter或setter的生成(如果已经存在)。
在使用ebeans ORM时,Play Enhancer默认开启。这是来自Play附带的默认plugins.sbt文件!申请:
// Play enhancer - this automatically generates getters/setters for public fields
// and rewrites accessors of these fields to use the getters/setters. Remove this
// plugin if you prefer not to have this feature, or disable on a per project
// basis using disablePlugins(PlayEnhancer) in your build.sbt
addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0")
// Play Ebean support, to enable, uncomment this line, and enable in your build.sbt using
// enablePlugins(SbtEbean). Note, uncommenting this line will automatically bring in
// Play enhancer, regardless of whether the line above is commented out or not.
addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "1.0.0")
选项是拥有公共字段并在没有getter的情况下使用它们,让玩游戏改变它或使用私有字段并定义你自己的getter和setter。