Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 播放框架表单映射递归项_Scala_Recursion_Playframework_Playframework 2.4_Playframework 2.5 - Fatal编程技术网

Scala 播放框架表单映射递归项

Scala 播放框架表单映射递归项,scala,recursion,playframework,playframework-2.4,playframework-2.5,Scala,Recursion,Playframework,Playframework 2.4,Playframework 2.5,我有一个case类,它的伴生对象中有一个表单映射: case class ContractItem(description: String, price: Option[BigDecimal], durationMonths: Option[Int], subItems: List[ContractItem]) object ContractItem { val mapping: Mapping[ContractItem] = Forms.mapping( "description"

我有一个case类,它的伴生对象中有一个表单映射:

case class ContractItem(description: String, price: Option[BigDecimal], durationMonths: Option[Int], subItems: List[ContractItem])
object ContractItem {
  val mapping: Mapping[ContractItem] = Forms.mapping(
    "description" -> text,
    "price" -> optional(bigDecimal),
    "durationMonths" -> optional(number),
    "subItems" -> Forms.list(ContractItem.mapping)
  )(ContractItem.apply)(ContractItem.unapply)
}
正如您所看到的,case类是递归的,因为它包含相同类型的列表,我已经尝试将其包含在映射中。这一切都可以编译,但当我尝试运行此项目时,我得到以下结果:

java.lang.NullPointerException
at play.api.data.RepeatedMapping.<init>(Form.scala:636)
at play.api.data.Forms$.list(Forms.scala:389)
at models.Installation$ContractItem$.<init>(Installation.scala:17)
at models.Installation$ContractItem$.<clinit>(Installation.scala)
at models.Installation$Contract$.<init>(Installation.scala:23)
at models.Installation$Contract$.<clinit>(Installation.scala)
at models.Installation$.<init>(Installation.scala:31)
at models.Installation$.<clinit>(Installation.scala)
at Temp.<init>(Temp.scala:82)
at .<init>(<console>:7)
at .<clinit>(<console>)
at .<init>(<console>:7)
at .<clinit>(<console>)
at $print(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:734)
at scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:983)
at scala.tools.nsc.interpreter.IMain.loadAndRunReq$1(IMain.scala:573)
at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:604)
at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:568)
at scala.tools.nsc.interpreter.ILoop.reallyInterpret$1(ILoop.scala:745)
at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:790)
at scala.tools.nsc.interpreter.ILoop.command(ILoop.scala:702)
at scala.tools.nsc.interpreter.ILoop.processLine$1(ILoop.scala:566)
at scala.tools.nsc.interpreter.ILoop.innerLoop$1(ILoop.scala:573)
at scala.tools.nsc.interpreter.ILoop.loop(ILoop.scala:576)
at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply$mcZ$sp(ILoop.scala:867)
at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:822)
at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:822)
at scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:135)
at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:822)
at scala.tools.nsc.interpreter.ILoop.main(ILoop.scala:889)
at xsbt.ConsoleInterface.run(ConsoleInterface.scala:69)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at sbt.compiler.AnalyzingCompiler.call(AnalyzingCompiler.scala:102)
at sbt.compiler.AnalyzingCompiler.console(AnalyzingCompiler.scala:77)
at sbt.Console.sbt$Console$$console0$1(Console.scala:23)
at sbt.Console$$anonfun$apply$2$$anonfun$apply$1.apply$mcV$sp(Console.scala:24)
at sbt.TrapExit$.sbt$TrapExit$$executeMain$1(TrapExit.scala:33)
at sbt.TrapExit$$anon$1.run(TrapExit.scala:42)
java.lang.StackOverflowError
at play.api.data.Mapping$class.$init$(Form.scala:416)
at play.api.data.OptionalMapping.<init>(Form.scala:704)
at play.api.data.Forms$.optional(Forms.scala:363)
at models.Installation$ContractItem$.mapping$lzycompute(Installation.scala:15)
at models.Installation$ContractItem$.mapping(Installation.scala:13)
at models.Installation$ContractItem$.mapping$lzycompute(Installation.scala:17)
at models.Installation$ContractItem$.mapping(Installation.scala:13)
at models.Installation$ContractItem$.mapping$lzycompute(Installation.scala:17)
at models.Installation$ContractItem$.mapping(Installation.scala:13)
at models.Installation$ContractItem$.mapping$lzycompute(Installation.scala:17)
at models.Installation$ContractItem$.mapping(Installation.scala:13)
at models.Installation$ContractItem$.mapping$lzycompute(Installation.scala:17)
at models.Installation$ContractItem$.mapping(Installation.scala:13)
结果如下:

java.lang.NullPointerException
at play.api.data.RepeatedMapping.<init>(Form.scala:636)
at play.api.data.Forms$.list(Forms.scala:389)
at models.Installation$ContractItem$.<init>(Installation.scala:17)
at models.Installation$ContractItem$.<clinit>(Installation.scala)
at models.Installation$Contract$.<init>(Installation.scala:23)
at models.Installation$Contract$.<clinit>(Installation.scala)
at models.Installation$.<init>(Installation.scala:31)
at models.Installation$.<clinit>(Installation.scala)
at Temp.<init>(Temp.scala:82)
at .<init>(<console>:7)
at .<clinit>(<console>)
at .<init>(<console>:7)
at .<clinit>(<console>)
at $print(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:734)
at scala.tools.nsc.interpreter.IMain$Request.loadAndRun(IMain.scala:983)
at scala.tools.nsc.interpreter.IMain.loadAndRunReq$1(IMain.scala:573)
at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:604)
at scala.tools.nsc.interpreter.IMain.interpret(IMain.scala:568)
at scala.tools.nsc.interpreter.ILoop.reallyInterpret$1(ILoop.scala:745)
at scala.tools.nsc.interpreter.ILoop.interpretStartingWith(ILoop.scala:790)
at scala.tools.nsc.interpreter.ILoop.command(ILoop.scala:702)
at scala.tools.nsc.interpreter.ILoop.processLine$1(ILoop.scala:566)
at scala.tools.nsc.interpreter.ILoop.innerLoop$1(ILoop.scala:573)
at scala.tools.nsc.interpreter.ILoop.loop(ILoop.scala:576)
at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply$mcZ$sp(ILoop.scala:867)
at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:822)
at scala.tools.nsc.interpreter.ILoop$$anonfun$process$1.apply(ILoop.scala:822)
at scala.tools.nsc.util.ScalaClassLoader$.savingContextLoader(ScalaClassLoader.scala:135)
at scala.tools.nsc.interpreter.ILoop.process(ILoop.scala:822)
at scala.tools.nsc.interpreter.ILoop.main(ILoop.scala:889)
at xsbt.ConsoleInterface.run(ConsoleInterface.scala:69)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at sbt.compiler.AnalyzingCompiler.call(AnalyzingCompiler.scala:102)
at sbt.compiler.AnalyzingCompiler.console(AnalyzingCompiler.scala:77)
at sbt.Console.sbt$Console$$console0$1(Console.scala:23)
at sbt.Console$$anonfun$apply$2$$anonfun$apply$1.apply$mcV$sp(Console.scala:24)
at sbt.TrapExit$.sbt$TrapExit$$executeMain$1(TrapExit.scala:33)
at sbt.TrapExit$$anon$1.run(TrapExit.scala:42)
java.lang.StackOverflowError
at play.api.data.Mapping$class.$init$(Form.scala:416)
at play.api.data.OptionalMapping.<init>(Form.scala:704)
at play.api.data.Forms$.optional(Forms.scala:363)
at models.Installation$ContractItem$.mapping$lzycompute(Installation.scala:15)
at models.Installation$ContractItem$.mapping(Installation.scala:13)
at models.Installation$ContractItem$.mapping$lzycompute(Installation.scala:17)
at models.Installation$ContractItem$.mapping(Installation.scala:13)
at models.Installation$ContractItem$.mapping$lzycompute(Installation.scala:17)
at models.Installation$ContractItem$.mapping(Installation.scala:13)
at models.Installation$ContractItem$.mapping$lzycompute(Installation.scala:17)
at models.Installation$ContractItem$.mapping(Installation.scala:13)
at models.Installation$ContractItem$.mapping$lzycompute(Installation.scala:17)
at models.Installation$ContractItem$.mapping(Installation.scala:13)
java.lang.StackOverflower错误
at play.api.data.Mapping$class.$init$(Form.scala:416)
at play.api.data.OptionalMapping.(Form.scala:704)
at play.api.data.Forms$可选(Forms.scala:363)
在models.Installation$contractem$.mapping$lzycompute(Installation.scala:15)
在models.Installation$constructem$.mapping(Installation.scala:13)
在models.Installation$contractem$.mapping$lzycompute(Installation.scala:17)
在models.Installation$constructem$.mapping(Installation.scala:13)
在models.Installation$contractem$.mapping$lzycompute(Installation.scala:17)
在models.Installation$constructem$.mapping(Installation.scala:13)
在models.Installation$contractem$.mapping$lzycompute(Installation.scala:17)
在models.Installation$constructem$.mapping(Installation.scala:13)
在models.Installation$contractem$.mapping$lzycompute(Installation.scala:17)
在models.Installation$constructem$.mapping(Installation.scala:13)
更改:

val mapping: Mapping[ContractItem]
致:


通过使
mapping
lazy,它能够在不抛出NPE的情况下引用自身。

同时有任何更新吗?@John-xkcd-