Java 重头戏2.5:表单验证-错误时,表单的值为;可选。空“;

Java 重头戏2.5:表单验证-错误时,表单的值为;可选。空“;,java,forms,validation,playframework,Java,Forms,Validation,Playframework,我正在用Play 2.5开发一个应用程序。模型和表单数据是独立的类,所以我有一个类“Page”和“PageForm” PageForm中有一个方法“validate()”,如果没有错误,则返回null;如果验证失败,则返回列表: public List<ValidationError> validate() { List<ValidationError> errors = new ArrayList<>(); Page checkForDup

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

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

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;
}
公共列表验证(){
列表错误=新建ArrayList();
Page checkForDuplicatePage=PageRepository.getInstance().getByName(名称);
if(checkForDuplicatePage!=null&&checkForDuplicatePage.id!=id){
添加(新的ValidationError(“名称”,“名称已被另一页使用”);
}
// ...
返回错误。isEmpty()?null:错误;
}
在我的控制器中,我调用:

Form<PageForm> form = formFactory(PageForm.class).bindFromRequest(); 
formform=formFactory(PageForm.class).bindFromRequest();
如果表单中的数据是正确的,那么这种方法非常有效。但是,如果validate()发现一个错误(不管是哪种错误,即使是
return new ArrayList()
也会触发该错误),则我表单的“value”属性是可选的。空的。“data”属性实际上拥有传递给表单的所有数据

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


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

我使用Scala Play而不是Java,所以YMMV。但对我来说,
validate
根本不应该返回
null
。如果没有错误,它应该返回空的
ArrayList
。我怀疑这将消除
None.get
错误消息。不过,我不确定我能帮上多少忙,因为我真的不太明白您的代码打算做什么。例如,句子

但是,如果validate()发现一个错误(不管是什么类型的错误,即使返回新的ArrayList()也会触发此错误)


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

我使用Scala Play而不是Java,所以YMMV。但对我来说,
validate
根本不应该返回
null
。如果没有错误,它应该返回空的
ArrayList
。我怀疑这将消除
None.get
错误消息。不过,我不确定我能帮上多少忙,因为我真的不太明白您的代码打算做什么。例如,句子

但是,如果validate()发现一个错误(不管是什么类型的错误,即使返回新的ArrayList()也会触发此错误)

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