模板中的“值getOrElse不是String的成员”

时间:2014-03-13 21:48:31

标签: scala playframework playframework-2.2

我有以下模板代码:

视图/ 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;
    }
}

编译以上内容是成功的。但是,如果 Login.scala.html 中的行@*email:@loginForm("email").value.getOrElse("xyz")*@未注释,则编译会产生value getOrElse is not a member of String错误。

为什么会这样?我希望排除模板mytemplates.loginform,但无法使其发挥作用。

编辑:根据estmatic的建议,我得到以下内容:

视图/ Login.scala.html:

@loginForm("email").getClass:class play.data.Form $ Field

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

视图/ mytemplates / loginform.scala.html:

@emailField.getClass:class play.core.j.PlayMagicForJava $$ anon $ 1

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

我必须在 Login.scala.html 中使用valueOr("")否则会产生NullPointer执行异常。显然,他们都是不同的阶级。我还没有使用Play框架,我不确定这意味着什么。

1 个答案:

答案 0 :(得分:5)

由于看起来你有一个Java项目,所以框架将在Java类和它们的Scala等价物之间进行一些自动转换。

试试这个:

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

Login.scala.htmlloginform.scala.html进行此更改,您将看到您正在处理每个方案中的不同类。

当您浏览loginform模板时,field.value将被包装在scala.Some对象中,这就是.getOrElse在这种情况下编译的原因。如果直接在主视图中执行此操作,则永远不会离开Java类世界,因此field.value将直接作为String返回。

如果您使用的是最新版本的Play,那么您应该可以使用Field.valueOr方法而不是getOrElse

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