在Play上显示错误! 2框架

时间:2014-03-28 04:47:45

标签: java playframework-2.0

播放后我遇到了很大困难! 2.2.x文档,我目前仍然坚持如何从表单验证中显示错误。

这是我的代码:

路线

GET         /account/create            controllers.Account.create()
POST        /account/create            controllers.Account.createAccount()

模型

public static UserAccount create(UserAccount data){
    UserAccount account = data;
    String salt     = BCrypt.gensalt();

    account.email   = data.email;
    account.salt    = salt;
    account.hash    = BCrypt.hashpw(data.hash, salt);

    account.save();
    return account;
}

控制器

// handles POST method
public static Result createAccount(){
    Form<UserAccount> userForm = form(UserAccount.class).bindFromRequest();
    if(userForm.hasErrors()){
        return badRequest();
    }else{
        UserAccount.create(userForm.get());
        Logger.info("Username is: " + userForm.get().email);
        return ok("ok, I recived POST data. That's all...");
    }
}

// Handles GET method
public static Result create(){
    return ok(
            views.html.account.form.render()
    );
}

浏览

@if(form.hasGlobalErrors) {
    <p class="error">
    @form.globalError.message
    </p>
}

@helper.form(action = routes.Account.createAccount()) {
    <input type="text" name="email" placeholder="Your Email Address"/><br/>
    <input type="password" name="password" placeholder="Your Password"/><br/>

    <input type="text" name="fname" placeholder="Your First Name"/><br/>
    <input type="text" name="midname" placeholder="Your Middle Name"/><br/>
    <input type="text" name="lname" placeholder="Your Last Name"/><br/>

    <input type="text" name="dob" placeholder="Your Birthday"/><br/>
    <select name="gender" id="gender">
        <option value="1">Male</option>
        <option value="2">Female</option>
        <option value="3">Undecided</option>
    </select><br/>

    <input type="submit" value="Login" />
}

错误消息

value hasGlobalErrors is not a member of object views.html.account.form

有谁能告诉我我的代码有什么问题?我对给定的例子感到沮丧。

编辑#1:

这是我到目前为止所做的:

型号:

public static UserAccount create(UserAccount data){
    UserAccount account = data;
    String salt     = BCrypt.gensalt();

    account.email   = data.email;
    account.salt    = salt;
    account.hash    = BCrypt.hashpw(data.hash, salt);

    account.save();
    return account;
}

控制器:

// HANDLES GET REQUEST
public static Result create(){
    return ok(
            views.html.account.form.render(userForm)
    );
}

// HANDLES POST REQUEST
public static Result createAccount(){
    Form<UserAccount> userForm = form(UserAccount.class).bindFromRequest();
    if(userForm.hasErrors()){
        return badRequest(views.html.account.form.render(userForm));
    }else{
        // UserAccount.create(userForm.get());
        // Logger.info("Username is: " + userForm.get().email);
        UserAccount data = userForm.get();
        return ok(data.email);
    }
}

查看/ TEMPLATE

@(form: Form[UserAccount])

@if(form.hasGlobalErrors) {
    <h1>Please fix the following error first</h1>
    <p>
        @form.globalError.message
    </p>
    <ul>
    @for(error <- form.globalErrors) {
        <li>@error.message</li>
    }
    </ul>
}

@helper.form(action = routes.Account.createAccount()) {
    <input type="text" name="email" placeholder="Your Email Address"/><br/>
    <input type="password" name="password" placeholder="Your Password"/><br/>

    <input type="text" name="fname" placeholder="Your First Name"/><br/>
    <input type="text" name="midname" placeholder="Your Middle Name"/><br/>
    <input type="text" name="lname" placeholder="Your Last Name"/><br/>

    <input type="text" name="dob" placeholder="Your Birthday"/><br/>
    <select name="gender" id="gender">
        <option value="1">Male</option>
        <option value="2">Female</option>
        <option value="3">Undecided</option>
    </select><br/>

    <input type="submit" value="Login" />
}

到目前为止,根据firebug,当我故意在表单上放错误时,服务器将返回badrequest。但是,模板不会显示错误。

如果我改变控制器:

public static Result createAccount(){
    Form<UserAccount> userForm = form(UserAccount.class).bindFromRequest();
    if(userForm.hasErrors()){
        return ok(userForm.errorsAsJson().toString());
    }else{
        // UserAccount.create(userForm.get());
        // Logger.info("Username is: " + userForm.get().email);
        UserAccount data = userForm.get();
        return ok("ok, I received POST data. That's all...");
    }
}

或者如果我在我的视图/模板上执行此操作

<pre>@form.errorsAsJson.toString()</pre>

它有效,并且相应地打印错误。有谁知道我在这里缺少什么?

编辑#2:

对我来说输出错误的最好方法是在我的视图/模板上执行此操作

@(form: Form[UserAccount])

@if(form.hasErrors) {
    <h1>Please fix the following error first</h1>

    <ul>
    @for(error <- form.errors) {
        <li>@error.toString</li>
    }
    </ul>
}

哪个输出:

(email,[ValidationError(email,error.required,[])])
(hash,[ValidationError(hash,error.required,[])])

由于我试图向用户显示适当的消息,因此该消息毫无用处。

3 个答案:

答案 0 :(得分:1)

您可以使用闪存范围:

控制器:

public Result create(){
   flash("error", "error msg");
   return badRequest(view.render());
}

查看:

@flash.get("error")

问题是您的表单没有“全局错误”,它对字段email和hash有错误。这是不同的。

您可以使用以下方法检查字段的错误:

@if(form.error("email") != null) { }

你可以在控制器上发出全局错误:

form.reject("global error");

更多信息: http://www.playframework.com/documentation/2.0/JavaSessionFlash

答案 1 :(得分:1)

在深入研究您的代码之后,有两点需要注意:

  1. 在模板中,您需要为表单字段使用帮助程序标记。帮助者将为您显示特定于字段的错误:http://www.playframework.com/documentation/2.2.x/JavaFormHelpers

  2. 我认为您的表单没有任何全局错误,这就是代码没有显示任何内容的原因。

  3. 尝试帮助,看看它是否适合你。

答案 2 :(得分:0)

我需要查看完整的模板,控制器和路由文件。我认为问题是你的模板文件顶部没有方法签名,如下所示:

@(userForm: Form[User])

修复模板后,您还遇到另一个问题,即您没有将表单传递给“badRequest()”流程中的视图模板。尝试将控制器操作更改为:

public static Result createAccount(){
    Form<UserAccount> userForm = form(UserAccount.class).bindFromRequest();
    if(userForm.hasErrors()){
        return badRequest(views.html.createUserTemplate.render(userForm));
    }else{
        UserAccount.create(userForm.get());
        Logger.info("Username is: " + userForm.get().email);
        return ok("ok, I recived POST data. That's all...");
    }
}

您的全局错误代码大多是正确的,它应如下所示:

@if(userForm.hasGlobalErrors) {
  <ul>
  @for(error <- userForm.globalErrors) {
    <li>@error.message</li>
  }
  </ul>
}