我的应用程序使用" 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中的错误吗?
答案 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
会导致问题。