表单验证播放框架2.0

Joh*_*ick 7 java validation playframework illegalstateexception

我正在关注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;

}
Run Code Online (Sandbox Code Playgroud)

在我的控制器中我做(作为示例),但我将值设置为空字符串以尝试@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);
}
Run Code Online (Sandbox Code Playgroud)

但在:

LoginForm postedLoginForm = loginForm.bind(anyData).get();
Run Code Online (Sandbox Code Playgroud)

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

所以它永远不会检查/来

if(loginForm.hasErrors()) 
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢你的帮助!

Pet*_*nes 25

这是预期的行为.

请注意,必须在表单上使用.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 
Run Code Online (Sandbox Code Playgroud)


小智 0

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

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