当我尝试在我的case类中添加一个新字段时,为什么Ficus会抛出异常?

时间:2017-11-02 06:02:13

标签: scala config

我的应用程序使用" typesafe.config"解析设置。然后使用" ficus"将Config对象转换为案例类的实例。 case类目前有19个构造函数参数。一切正常。但是,当我在我的" settings.conf"中添加一个新参数和一个新的相应字段时,我得到以下异常:

An exception or error caused a run to abort: MyCaseClass.<init>(Ljava/lang/String;Lscala/Option;Lscala/Option;IZLscala/collection/Seq;Ljava/lang/String;ILscala/concurrent/duration/FiniteDuration;ZLscala/Option;Lscala/Option;ILscala/Option;Lscala/concurrent/duration/FiniteDuration;Ljava/lang/String;Ljava/lang/String;II)V 
java.lang.NoSuchMethodError: MyCaseClass.<init>(Ljava/lang/String;Lscala/Option;Lscala/Option;IZLscala/collection/Seq;Ljava/lang/String;ILscala/concurrent/duration/FiniteDuration;ZLscala/Option;Lscala/Option;ILscala/Option;Lscala/concurrent/duration/FiniteDuration;Ljava/lang/String;Ljava/lang/String;II)V

我可以看到&#34; typesafe.config&#34;正确地将我的新字段解析为Config对象。但是ficus会抛出这个例外。新字段和新案例类构造函数参数具有完全相同的名称。

为什么会发生这种情况的任何想法?

具体问题记录在以下提交中:

1)https://github.com/ceilican/Scorex/commit/133157a6ad070cad7a57624c511ee917133ed5f1

2)https://github.com/ceilican/Scorex/commit/074e0bc5add3c666b0943497a5579f3fd365084d

3)https://github.com/ceilican/Scorex/commit/7c8d3475377a17b2a5383bf3a99d797650ca8bc3

前两个提交正在进行中。对于第三个,抛出上述异常。

正如您所看到的,提交2和提交3之间没有太大的概念差异。我不理解为什么提交2有效,而提交3则没有。

我认为可能是因为case类中有大量参数,但是下面的提交表明当我将新字段添加到较小的case类时,问题也会发生:

4)https://github.com/ceilican/Scorex/commit/1c253b2b526db1539fa674069232cf02784c4bfb

当我尝试在提交4之后运行代码时抛出相同类型的异常。

这是Ficus中的错误吗?

1 个答案:

答案 0 :(得分:0)

在主项目和子项目上执行sbt clean后,问题就停止了。我的猜测是,Ficus的宏魔法基于我的case类生成函数,但是在修改case类时不会重新生成它们。然后,当Ficus尝试使用与新案例类不兼容的过时函数时,抛出异常。

有趣的是,只有当我修改&#34;嵌套&#34;案例类。如果配置文件是:

main {
  nested {
    param: 0
  }
}

与案例类:

case class MainCaseClass(nested: NestedCaseClass)

case class NestedCaseClass(param: Int)

然后,修改MainCaseClass不会导致问题,但修改NestedCaseClass会导致问题。