【问题标题】:Form validation play framework 2.0表单验证播放框架2.0
【发布时间】:2012-04-16 11:54:39
【问题描述】:

我正在关注http://www.playframework.org/documentation/2.0/JavaForms的教程

我创建了一个类 LoginForm.java(而不是示例中的 User.class。不是用于持久化的类,只是一个表单值持有者)

package domain;

import static play.data.validation.Constraints.*;

public class LoginForm {

        @Required
        public String email;
        public String password;

}

在我的控制器中我这样做(作为示例),但我将值设置为空字符串以尝试 @Required 注释。

Form<LoginForm> loginForm = form(LoginForm.class);
Map<String,String> anyData = new HashMap();
anyData.put("email", "");
anyData.put("password", "");

//Faking a post
LoginForm postedLoginForm = loginForm.bind(anyData).get();

if(loginForm.hasErrors()) {
  //Just for this test task, should have another error handling..
  return ok("@Required annotation kicked in..");
} else {
  return ok("Got form values, email: " + postedLoginForm.email + " password: " + postedLoginForm.password);
}

但是在:

LoginForm postedLoginForm = loginForm.bind(anyData).get();

我得到一个执行异常 [[IllegalStateException: No value]]

所以它永远不会检查/来到

if(loginForm.hasErrors()) 

有人知道这是为什么吗?如果我将值设置为示例:

Map<String,String> anyData = new HashMap();
anyData.put("email", "bob@gmail.com");
anyData.put("password", "secret");

一切正常,我用正确的值检索 LoginForm 对象。 我应该抓住异常吗?不应该玩照顾它并设置 loginForm.hasErrors = true 吗?

感谢您的帮助!

【问题讨论】:

  • IllegalStateException 似乎来自bind。当您的地图没有数据时,也许该方法不允许您使用bindget
  • 我明白了,但是当我使用 loginForm.bindFromRequest().get() 绑定来自请求的数据时,真实的帖子也是如此。如果用户没有在表单字段中输入任何数据,将如何验证?无需编写自己的验证方法?
  • 但是您说真正的帖子有效,您的地图中没有空值。
  • 对不起,真正的帖子也没有工作。使用空输入字段值。
  • 所以填入电子邮件和密码的帖子不起作用?你说它在你的帖子中按预期工作。

标签: java playframework validation illegalstateexception


【解决方案1】:

这似乎是 Play 2.0 框架的一个错误。我能够在本地复制同样的问题。

我开了一张票 https://play.lighthouseapp.com/projects/82401-play-20/tickets/313 以防你想跟进。

【讨论】:

  • 问题因无效而关闭 - 这是预期行为
【解决方案2】:

这是预期的行为。

请注意,您必须在检查错误后在表单上使用 .get()。

LoginForm preLoginForm = loginForm.bind(anyData);

if(loginForm.hasErrors()) {
    //Just for this test task, should have another error handling..
    return ok("@Required annotation kicked in..");
}
LoginForm postedLoginForm = preLoginForm.get();
// ... Now use postedLoginForm 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 2014-05-30
    • 1970-01-01
    • 2013-10-16
    相关资源
    最近更新 更多