使用包含超过22个参数的Play Framework和案例类

时间:2017-10-03 18:47:42

标签: json scala playframework case-class

我已经看到一些涉及臭名昭着的“22字段/参数”问题的其他问题,这是Scala V<的固有错误(特征?)。 2.11。请参阅herehere。但是,根据此blog postcase class中的22参数限制似乎已得到修复;至少在语言方面。

我有一个case class我希望加载一个任意值(读取:> 22),稍后将使用Play库将这些值读入JSON对象。

它看起来像这样:

object L {
  import play.api.libs.json.Reads. _
  import play.api.libs.functional.syntax._

  implicit val responseRead: Reads[L] = (
    MyField1.jsPath.Read[MyField1.t] and 
    MyField2.jsPath.Read[MyField2.t] and
    ...
    MyField35.jsPath.Read[MyField35.t]
  ) (L.apply _)
}

case class L(myField1: MyField1.t, myField2: MyField2.t, ... myField35: MyField35.t)

问题是在编译时,Scala抱怨case class中有超过22个参数。 (具体来说:在对象定义的最后一行,当编译器尝试构建时,我得到:“实现将函数限制为22个参数”。)我目前正在使用Scala v2.11.6,所以我想想这不是语言问题。这让我觉得Play库没有更新Read的实现。

如果是这种情况,那么我猜最好的办法是将相关字段分组为元组并通过JSON API传递元组?

3 个答案:

答案 0 :(得分:1)

正如您引用的博客文章中所提到的,22参数限制对Scala 2.11及更高版本中的函数仍然有效,因此您遇到的语言问题。在这种情况下,函数调用是:

L.apply _

重构模型是解决此限制的一种方法。

答案 1 :(得分:0)

所以这个问题的答案实际上是两个部分:

1。解决方法

我将其称为“解决方法”,因为虽然它“有效”但通常会解决症状,而不是问题。

我的解决方案是使用shapeless来提供任意长度的通用异构列表。该解决方案已经在其他地方广泛讨论并可用。参见,例如,(1)[SO Post] How to get around the Scala case class limit of 22 fields?; (2)Blog post; (3)Yet another blog post

2。溶液

正如@ jeffrey-chung提到的那样,重组模型来处理这个限制。正如业内许多人所指出的那样,拥有一个超过30个参数的函数可能表明你的函数做得太多,或者该函数应该被重构以摄取少量参数。参见,例如,(1)Rule of 30 – When is a method, class or subsystem too big?; (2)Databrick's style guide

答案 2 :(得分:0)

在此处查看答案 https://stackoverflow.com/a/57317220/1606452

看来这一切都很好。

+22个用于case-json的现场案例类格式化程序及更多 https://github.com/xdotai/play-json-extensions

支持Scala 2.11.x,2.12.x和2.13.x并播放2.3、2.4、2.5和2.7

play-json issue中被引用为首选解决方案(但尚未合并)