播放2.5:表单验证 - 出错时,表单值为“Optional.empty”

时间:2016-08-01 19:05:39

标签: java forms validation playframework

我正在使用Play 2.5开发应用程序。模型和表单数据是单独的类,因此我有一个“Page”和“PageForm”类。

在PageForm中是一个方法“validate()”,如果没有错误则返回null,如果验证失败则返回List:

public List<ValidationError> validate() {
    List<ValidationError> errors = new ArrayList<>();

    Page checkForDuplicatePage = PageRepository.getInstance().getByName(name);

    if(checkForDuplicatePage != null && checkForDuplicatePage.id != id) {
        errors.add(new ValidationError("name", "The name is already in use by another page"));
    }

    // ...

    return errors.isEmpty() ? null : errors;
}

在我的控制器中,我打电话:

Form<PageForm> form = formFactory(PageForm.class).bindFromRequest(); 

如果表单中的数据正确,这非常有效。但是,如果validate()发现错误(并且它确实无关紧要,即使return new ArrayList<>()触发了这个),我的表单的“value”属性也是Optional.empty。 “data”属性实际上已将所有数据传递给表单。

这意味着我无法使用表单将其传递给我的视图,该视图应显示带有错误消息的数据。相反,我得到[CompletionException: java.util.NoSuchElementException: No value present]。有时(我还没弄清楚为什么会发生这种情况)它也说[CompletionException: java.util.NoSuchElementException: None.get]

我将我的代码与其他项目和官方文档进行了比较,但他们似乎都在做我在这里所做的事。

1 个答案:

答案 0 :(得分:0)

我使用Scala Play而不是Java,所以YMMV。但对我来说,我不认为validate应该返回null。如果没有错误,它应该返回空ArrayList。我怀疑这将消除None.get错误消息。但是,我不确定我能提供多少帮助,因为我不太清楚你的代码的目的是什么。例如,句子

  

但是,如果validate()发现错误(并且它确实不重要,即使返回新的ArrayList&lt;&gt;()也会触发此错误)

对我来说似乎有点模棱两可。触发错误的return new ArrayList<>()调用在哪里?