“价值getOrElse不是字符串中的一员”,在模板(“value getOrElse is not

2019-10-19 14:13发布

我有以下模板代码:

意见/ Login.scala.html:

@(loginForm: Form[views.Data])

@import mytemplates.loginform

@Main("") {
    email:@loginform(loginForm("email"))
    @*email:@loginForm("email").value.getOrElse("xyz")*@
}

意见/ mytemplates / loginform.scala.html:

@(emailField: Field)

@emailField.value.getOrElse("xyz")

意见/ Main.scala.html:

@(page: String)(content: Html)

<!DOCTYPE html>

<html>
    <body>
    @content
</html>

意见/ Data.java:

package views;

import play.data.validation.ValidationError;
import java.util.List;

public class Data {

    public String email = "";

    public Data() { }

    public List<ValidationError> validate() {

        return null;
    }
}

上述编译是成功的。 但是,如果线@*email:@loginForm("email").value.getOrElse("xyz")*@Login.scala.html是注释掉编译生成一个value getOrElse is not a member of String错误。

为什么会出现这种情况? 我想排除模板mytemplates.loginform ,但不能让它开始工作。

编辑:继estmatic的意见,我得到如下:

意见/ Login.scala.html:

@loginForm("email").getClass :类play.data.Form $场

@loginForm("email").valueOr("").getClass类java.lang.String

意见/ mytemplates / loginform.scala.html:

@emailField.getClass :类play.core.j.PlayMagicForJava $$不久$ 1

@emailField.value.getClass :类scala.None $

我不得不使用valueOr("")Login.scala.html否则空指针异常的执行将产生。 显然,他们都是不同的类别。 我没有使用播放框架太多,我不知道这意味着什么。

Answer 1:

因为它看起来像你有一个Java项目,该框架将要在这里和那里做Java类和它们的斯卡拉相当于之间的一些自动转换。

尝试了这一点:

@loginForm("email").getClass()
@loginForm("email").value.getClass()

就这两个变化Login.scala.htmlloginform.scala.html ,你会看到你正在处理中的每个场景中不同的班级。

当你通过loginform模板您field.value将被包装在一个scala.Some对象,这就是为什么.getOrElse在这种情况下编译。 当您直接在主视图中做到这一点,你永远不会离开Java的类世界,让您的field.value直接返回一个String

如果您使用的是最新版本的游戏,那么你应该能够使用Field.valueOr方法,而不是getOrElse

@loginForm("email").valueOr("xyz")


文章来源: “value getOrElse is not a member of String” in template