我正在使用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]
。
我将我的代码与其他项目和官方文档进行了比较,但他们似乎都在做我在这里所做的事。
答案 0 :(得分:0)
我使用Scala Play而不是Java,所以YMMV。但对我来说,我不认为validate
应该返回null
。如果没有错误,它应该返回空ArrayList
。我怀疑这将消除None.get
错误消息。但是,我不确定我能提供多少帮助,因为我不太清楚你的代码的目的是什么。例如,句子
但是,如果validate()发现错误(并且它确实不重要,即使返回新的ArrayList&lt;&gt;()也会触发此错误)
对我来说似乎有点模棱两可。触发错误的return new ArrayList<>()
调用在哪里?