Play Framework Form验证错误

时间:2014-02-02 01:45:29

标签: java forms validation playframework

我正在看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。需要,[])]}

数据肯定存在,当我在提交后重定向到表单时,字段仍然填充了正确的数据。我错过了一些明显的东西吗?

2 个答案:

答案 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。