表单验证后的 Playframework IllegalStateException

标签 playframework validation playframework-2.0

我尝试使用 JSR-303 注释(类级别)和验证器实现为 play 2.0.1 编写自定义表单验证器。

不幸的是,当我提交表单并且验证失败时,我收到了一个 IllegalStateException,这可能是一个游戏的错误(但我想确认一下)。

请在下面找到相关的代码摘录和问题描述(为了清楚起见,只列出相关部分)

部分 Controller 代码(接收表单提交)

public static Result save() {
    Form<UserForm> userForm = form(UserForm.class).bindFromRequest();
    if (userForm.hasErrors()) {
        return badRequest(createForm.render(userForm));
    }
    UserForm user = userForm.get();

验证器被声明为
public class FieldMatchValidator extends Validator<Object>
    implements ConstraintValidator<FieldMatch, Object>

验证注释声明为
@Target({TYPE, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = FieldMatchValidator.class)
@play.data.Form.Display(name="constraint.fieldmatch")
public @interface FieldMatch {

    String message() default FieldMatchValidator.message;
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};

提交表单我收到错误
Caused by: java.lang.IllegalStateException: No value
    at play.libs.F$None.get(F.java:217) ~[play_2.9.1.jar:2.0.1]
    at play.data.Form.get(Form.java:363) ~[play_2.9.1.jar:2.0.1]
    at controllers.UsersController.save(UsersController.java:40) ~[classes/:2.0.1]
    at Routes$$anonfun$routes$1$$anonfun$apply$25$$anonfun$apply$26.apply(routes_routing.scala:189) ~[classes/:na]
    at Routes$$anonfun$routes$1$$anonfun$apply$25$$anonfun$apply$26.apply(routes_routing.scala:189) ~[classes/:na]
    at play.core.Router$HandlerInvoker$$anon$4$$anon$1.invocation(Router.scala:1086) ~[play_2.9.1.jar:2.0.1]

提到的 UsersController 的行是调用 UserForm user = userForm.get();

试图了解问题出在哪里,我发现有问题的代码可能在 Form.java 中。

Form bind(Map data, String... allowedFields) 包含:
if(result.hasErrors()) {

    for(FieldError error: result.getFieldErrors()) {
    ...
    }
return new Form(rootName, backedType, data, errors, None());
}

而 hasErrors() 是
public boolean hasErrors() {
    return !errors.isEmpty();
}

发生的情况是 result.hasErrors() 返回 true(因为在类级别定义的验证器失败),但构建的错误列表仍然为空(result.getFieldErrors() 返回一个空列表)。

结果 Form.hasErrors() 返回 false 但 Form.get() 失败。

我错过了什么还是它实际上是一个错误?

感谢致敬,

最佳答案

这是游戏中的一个错误。如果您的表单实现了验证,只需确保该方法在没有错误时返回 null。如果您返回一个空 map ,那么它将失败

关于表单验证后的 Playframework IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11388269/

相关文章:

java - 下载的文件是 html View ,而不是带有 Play Framework 的 CSV

maven-2 - 如何使用 Hudson 构建 Play 项目?

php - Laravel 5 中的 After Validation Hook 有什么用

c# - 用空格替换 Unicode 字符 "�"

java - 玩框架zentasks教程groupBy

java - 没有 EntityManager 绑定(bind)到全局?尝试从 onHandlerNotFound 进行事务处理

java - 如何使用Ebean自动DDL生成定义mysql引擎或默认字符集

html - <body> 内的 &lt;style&gt; 标签添加自定义 CSS 的有效解决方法?

playframework-2.0 - 如何配置Logback以打印出类名

heroku - 在 heroku 上部署 play20 应用程序 (v. 2.0.2)