将枚举绑定到路径或查询中

时间:2017-06-21 16:12:10

标签: scala playframework

我有一个scala Enumeration如下:

object SearchTypes extends Enumeration {
  type TypeAlias = Value
  val firstVal, secondVal, thirdVal = Value
}

我希望能够通过查询字符串传递它 - 我的routes看起来像

/search  @searchController.search(searchType: SearchTypes.TypeAlias)

尝试运行播放应用程序时,会抛出一系列错误,包括:

  

[error] / Users / my-user / code / project / conf / routes:8:找不到类型为SearchTypes.TypeAlias的QueryString绑定器。尝试为此类型实现隐式QueryStringBindable。

如何教游戏来解析Enumeration

1 个答案:

答案 0 :(得分:2)

有一个很好的深入撰写here,但关键是要在QueryStringBindable.Parsing 中实施Enumeration 。例如:

object SearchTypes extends Enumeration {
  // other declarations

  implicit object searchTypeQueryStringBinder 
    extends QueryStringBindable.Parsing[SearchTypes.TypeAlias](
      withName(_), 
      _.toString, 
     (k: String, e: Exception) => "Cannot parse %s as SearchTypes: %s".format(k, e.getMessage())
  )
}

(您可以通过用更复杂的东西替换对withName(_)的直接调用来编写更复杂的基于案例的解析逻辑。)

执行此操作后,routes应该得到满足,因为play可以在string和您的Enumeration之间进行转换。

请注意,如果您想直接在路径中使用Enumeration - 而不是在查询字符串中使用 - 那么您需要扩展PathBindable.Parsing而不是QueryStringBindable.Parsing。< / p>