如何在带有Pathbindable的Play路径文件中使用Tagged Type

时间:2017-05-27 15:27:27

标签: scala playframework phantom-types

对于处理大量ided实体的服务,我试图进行一些强类型操作。为了达到这个目的,我使用了一种基于幻像类型/标记类型的技术,因为它可以在无形或scalaz中找到。 (我不想使用AnyVal,因为我真的不想支付装箱/拆箱的费用)

我做了一个最小的例子,它遇到了以下编译错误:

class type required but String with controllers.TestController.Tagged[controllers.MyId] found

以下是文件:

  • 应用程序/控制器/ TestController.scala
package controllers

import javax.inject._

import controllers.TestController.TString
import play.api.mvc._

trait MyId

object TestController {

  trait Tagged[U]
  type TString[T] = String with Tagged[T]
  def TString[T](s: String) =  s.asInstanceOf[String with Tagged[T]]

  implicit def tStringPathBindable[T](implicit binder : PathBindable[String]) : PathBindable[TString[T]] =
    binder.transform(TString,identity)
}

@Singleton
class TestController @Inject() extends Controller {

  def index(id : TString[MyId]) = Action { implicit request =>
    Ok("")
  }

}
  • conf / routes

    GET / myroute /:id controllers.TestController.index(id:TString [MyId])

build.sbt

name := """play-tag"""

lazy val root = (project in file(".")).enablePlugins(PlayScala)

scalaVersion := "2.11.11"

// Adds additional packages into conf/routes
play.sbt.routes.RoutesKeys.routesImport ++=
  Seq(
    "controllers.MyId",
    "controllers.TestController._"
  )
  • 项目/ build.properties

    sbt.version = 0.13.15

  • 项目/ plugins.sbt

    addSbtPlugin(“com.typesafe.play”%“sbt-plugin”%“2.5.14”)

有没有办法解决这个错误?如果没有,是什么原因?必然的问题,实现我想要做的事情的最佳做法是什么?例如,我不喜欢我暴露出Id由字符串组成的事实,但我不想要太多样板,因为我有很多实体需要处理。

0 个答案:

没有答案