2016-12-15 53 views
0

这有点奇怪,因为Play框架坚持Java或Scala。在我的情况下,我想要Scala,但也想构建play-authenticate项目的顶部,该项目是作为Play Java插件(而不是Scala)实现的。Play 2.5如何转换Scala Form至Java Form?

尝试迁移其使用样品Scala和承担大部分迁移到斯卡拉后,我碰上有斯卡拉play.api.data.Form类型的问题,需要通过对游戏进行身份验证框架的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 { 
+0

据我所知,你必须使用'''''PlayMagicForJava''' 这里的文档:https://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.core .j.PlayMagicForJava $ 然后手动转换所有字段并构造一个新的Scala表单。 –

+0

某处有什么要求吗?声音涉及这样做... –

回答

0

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