模板中的"值getOrElse不是String的成员"

ser*_*ron 1 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")*@
}
Run Code Online (Sandbox Code Playgroud)

意见/ mytemplates/loginform.scala.html:

@(emailField: Field)

@emailField.value.getOrElse("xyz")
Run Code Online (Sandbox Code Playgroud)

意见/ Main.scala.html:

@(page: String)(content: Html)

<!DOCTYPE html>

<html>
    <body>
    @content
</html>
Run Code Online (Sandbox Code Playgroud)

意见/ 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译上述内容是成功的.但是,如果线@*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: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 $

我不得不valueOr("")Login.scala.html中使用,否则将生成NullPointer执行异常.显然,他们都是不同的阶级.我没有太多使用Play框架,我不确定这意味着什么.

est*_*tic 5

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

试试这个:

@loginForm("email").getClass()
@loginForm("email").value.getClass()
Run Code Online (Sandbox Code Playgroud)

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

当你浏览loginform模板时,你field.value将被包裹在一个scala.Some对象中,这就是为什么要.getOrElse编译的原因.当您在主视图中直接执行此操作时,您永远不会离开Java类世界,因此您field.value将直接返回为String.

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

@loginForm("email").valueOr("xyz")
Run Code Online (Sandbox Code Playgroud)