播放2.5如何从Scala表单转换为Java表单?

时间:2016-12-15 20:49:10

标签: scala playframework play-authenticate

这有点奇怪,因为Play框架坚持使用Java或Scala。就我而言,我想要Scala,但也希望构建作为Play Java插件(而不是Scala)实现的play-authenticate项目的顶层。

尝试将他们的使用示例迁移到Scala,并且在完成向Scala的大部分迁移之后,我遇到了使用Scala play.api.data.Form类型的问题,并且需要传递给play-authenticate框架Java play.data.Form类型。因此,我需要在这两个独立的(没有通用的抽象或任何​​东西)类之间进行转换。

我已经检查了play.core.j.JavaHelpers实现,但没有任何内容可以在两个单独的Form类型之间进行转换。我可以手动完成,但这是一个维护费用,并且想知道是否有人已经碰到了这个以及它是如何解决的?

更新我尝试PlayMagicForJava如下,但没有魔法:X

import javax.inject.{Inject, Singleton}

import play.api.data.Forms._
import play.api.i18n.Messages
import play.api.mvc.RequestHeader

case class Signup(email: String, password: String, repeatPassword: String, username: String)

@Singleton
class SignupForm @Inject() (implicit val request: RequestHeader, messages: Messages) {
  import play.core.j.PlayMagicForJava._

  val Instance : play.data.Form[Signup] = play.api.data.Form {
    mapping(
      "email" -> email,
      "password" -> nonEmptyText(minLength = 5),
      "repeatPassword" -> nonEmptyText(minLength = 5),
      "username" -> nonEmptyText()
    )(Signup.apply)(Signup.unapply).
      verifying(messages("playauthenticate.password.signup.error.passwords_not_same"),
        data => data.password != null && !data.password.isEmpty && data.password.equals(data.repeatPassword))
  }
}

和错误:

[error] SignupForm.scala:16: type mismatch;
[error]  found   : play.api.data.Form[views.form.Signup]
[error]  required: play.data.Form[views.form.Signup]
[error]       val Instance : play.data.Form[Signup] = Form {

1 个答案:

答案 0 :(得分:0)

非常不幸的是,唯一的方法是将受影响的表单重写为Play Java Forms。混合方法导致视图中存在期望Scala play.api.data.Form类型而非Java play.data.Form类型的问题,但支持此混合方法的解决方案是将PlayMagicForJava静态上下文导入受影响的视图。