玩2.5 如何将Scala Form转换为Java Form?
Play 2.5 How to convert from Scala Form to Java Form?
这有点奇怪,因为对于 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
类型之间没有任何转换。我可以手动完成,但这是一个维护成本,想知道是否有人遇到过这个问题以及它是如何解决的?
UPDATE 我试过 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 {
非常遗憾,唯一的方法是重写受影响的表单以播放 Java 表单。混合方法导致期望 Scala play.api.data.Form
类型而不是 Java play.data.Form
类型的视图出现问题,但支持这种混合方法的解决方案是将 PlayMagicForJava
静态上下文导入受影响的视图。
这有点奇怪,因为对于 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
类型之间没有任何转换。我可以手动完成,但这是一个维护成本,想知道是否有人遇到过这个问题以及它是如何解决的?
UPDATE 我试过 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 {
非常遗憾,唯一的方法是重写受影响的表单以播放 Java 表单。混合方法导致期望 Scala play.api.data.Form
类型而不是 Java play.data.Form
类型的视图出现问题,但支持这种混合方法的解决方案是将 PlayMagicForJava
静态上下文导入受影响的视图。